초보 개발자입니다.
학교에서도 선생님한테 배우는 게 더 정확하지만
또래 친구들이 알려주는 것이 정확하지는 않아도
더욱 추상적이고 쉬운 표현을 쓰기에 이해가 쉽게 되는 경우도 더러 있습니다.
저 또한 제가 이해한 느낌으로 표현하면서, 복습 효과까지 가져가려고 합니다.
다소 이상한 내용이 있다면 댓글로 남겨주세요!
항상 감사하는 마음으로 한번 더 배우겠습니다.
감사합니다!
책에 나와있는 예제를 따라 치다보면 throw, try, catch, finally와 같은 키워드들이 나온다.
여태까지는 성급히 따라치기 바빴지만, 여러 문서를 참고하며 이해하다 보니
생각보다 별게 아니라는것을 느꼈다.
잘 알지는 못하지만 다음에 이 글을 보고 다시 이해할 수 있도록
내 표현으로 정리해두려고 한다.
♣ 예외는 이런 저런 이유로 발생한다.
- Exception in thread "main" java.lang.ArithmeticException: / by zero
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
'에러'가 아닌 '예외'는 보통 프로그래머의 실수로 발생하는 경우가 많다.
이런 예외를 처리해주기 위해, 코드를 작성하는 게 throw, try, catch, finally 와 같은 키워드이다.
마치, "요런것은 예외로 처리해서, 내가 지정한 방식으로 처리해야지" 같은 개념이다.
어떻게 보면 'if~else'와 비슷한 면도 있는 것 같다.
자잘한 코드 말고, 큼지막한 예제들로 이해해보자.
public class Exception_Tistory {
public void shouldBeRun() {
System.out.println("finally는 무적권 실행!!");
}
public static void main(String[] args) {
Exception_Tistory test = new Exception_Tistory();
int c;
try { // try 블록안에서 Exception이 발생하면 catch로 넘어감
c = 4 / 0;
System.out.println("c의 값은 " + c);
} catch (Exception e) { // try 블록안에서 예외가 발생하면
System.out.println("Exception 발생!!!");
} finally { // Exception이 발생해도 무조건 실행됨
test.shouldBeRun();
}
}
}
"Exception 발생!!!" "finally는 무적권 실행!!" |
* try { } - 블록안에서 Exception이 발생하면 catch로 달려간다 (catch의 파라미터에 따라 다를 수 있음).
* catch { } - 설치해 놓은 트랩(Exception)이 작동하면 지정해놓은 어떤 일이 발생함
* fianlly { } - 예외가 발생하던 말던, 무조건 실행되는 코드!
♣ throw - 예외 발생시키기
try-catch-finally만 사용하면 될 것을, 굳이 왜 throw를 사용하는 하는 걸까?
try만 사용한다면 시스템이 Exception이라고 지정해 놓은 것만 catch로 넘어가기 때문이다.
누군가 나를 '바보'라고 부른다면 나는 그것을 Exception으로 처리하여 못 들은 척할 수 있다.
참고로 Exception은 크게 두 가지로 구분된다.
- RuntimeException // 실행 시 발생하는 예외
- Exception // 컴파일 시 발생하는 예외, 예측이 가능하다
예시를 보자.
public class Test {
public void sayNick(String nick) throws Exception { // 메소드에 throws를 붙여주면, 호출한 놈(main)이 처리를 해야합니다.
if (nick.equals("바보")) { // 누군가 나한테 바보라고 한다면, 예외처리를 통해 못 들은척 할꺼야.
throw new Exception(); // 예외처리 발생!
}
System.out.println("당신의 별명은 " + nick + " 입니다. ");
}
public static void main(String[] args) {
Test test = new Test(); // 현 클래스를 객체화 합니다.
try {
test.sayNick("멋쟁이");
test.sayNick("바보");
} catch (Exception e) {
System.out.println("Exception 발생!! - 바보라고 하지 마세요");
}
}
}
throw 사용해서, '바보'를 예외처리해주었습니다.
간단하게라도 이해되셨기를 바랍니다~~