Java의 기본 개념 중 exception에 대해 알아보자.
Exception은 언제 활용할까?
물론 예외 처리를 확실히하면 좋지만, 본래의 목적은 코드 실행 중에 에러가 나더라도, 프로그램을 중단시키지 않고 끝까지 실행하기 위함이다.
e.printStackTrace();
을 통해 그 내용을 자세하게 확인할 수 있다.
public class hello {
public static void main(String[] args) {
System.out.println(1);
int a = 4, b = 0;
try {
System.out.println(a/b);
} catch (Exception e) {
System.out.println(3);
// e.printStackTrace();
}
System.out.println(2);
int[] ar = {1, 2, 3};
try {
ar[10] = 10;
} catch (Exception e) {
// e.printStackTrace();
}
System.out.println(4);
String str = "호랑이";
System.out.println(str.length());
str = null; //이제부터는 객체가 아니다
//NullPointerException
try {
System.out.println(str.length());
} catch (Exception e) {
}
System.out.println(5);
}
}
Exception 중 Unhandled Exception이 있다.
이것은 try-catch를 활용하여 해결할 수 있다.
다음의 예시 중 class Tiger의 f1()과 f2()를 자세히 보면,
f1()은 메소드 안에서 try-catch문을 사용한 반면
f2()는 throws Exception을 통해
f2()가 error를 catch하지 않고 함수를 호출한 부분에서 catch하도록 한다.
따라서 main 함수 안에서
t.f2();
를 호출하면 이 부분에서 catch를 하도록 책임을 미뤘는데, catch를 하지 않았으므로 error가 발생한다.
따라서 try { t.f2(); } catch (Exception e) {}
이처럼 catch를 걸어주어야 한다.
만약 f2()를 호출하는 부분에서 catch를 활용하고 싶지 않다면, 해당 클래스 전체에 throws Exception
을 사용하면 해결되긴 한다. 그러나 이 방법은 책임을 계속해서 미루는 것이므로 추천하지 않는다 !
class Tiger {
void f1() {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
void f2() throws Exception{ //f2가 catch를 하지 않고, 함수를 호출한 부분에서 catch하도록
throw new Exception();
}
}
public class hello {
public static void main(String[] args) {
System.out.println(1);
Tiger t = new Tiger();
t.f1();
System.out.println(2);
//Unhandled Exception -> Try-Catch 로 해결
//t.f2(); // 함수를 호출하는 부분에서 catch해야 하는데, 하지 않아서 error
try { t.f2(); } catch (Exception e) {}
//t.f2(); // 함수를 호출하는 부분에서 catch해야 하는데, 하지 않아서 error
// 이럴 때는 main에 throws Exception에 걸면 되긴 함
//Unhandled Exception -> Try-Catch 로 해결
//Thread.sleep(3000); //ms
try {Thread.sleep(3000);} catch (Exception e) {}
System.out.println(3);
for (int i = 0; i < 4; i++) {
try {Thread.sleep(1000);} catch (Exception e) {}
System.out.println("Tag : " + i);
}
}
}
Finally는, 어떤 경우에도(exception이 발생하더라도) 코드가 실행되도록 한다.
어떤 경우에 이를 활용할까?
class Tiger {
void f1() {
try {
if(3 > 2) {
System.out.println("test1");
} else {
System.out.println("test2");
return; //함수 중단
//finally를 활용하면 함수가 중단되더라도 그 다음을 실행할 수 있다.
}
} catch (Exception e) {
} finally {
System.out.println("test3");
}
}
}
public class hello {
public static void main(String[] args) {
System.out.println(1);
try {
System.out.println(2);
System.out.println(4/0);
} catch (Exception e ) {
System.out.println(3);
} finally { //어떤 경우에도 실행
System.out.println(4);
}
//finally의 목적은 ? return이후에도 코드 실행 가능 !
Tiger t = new Tiger();
t.f1();
}
}
위의 예시를 보면 return문 이후에도 코드를 실행시키고 싶을 때 finally를 활용할 수 있다는 것을 알 수 있다. 왜냐하면 finally는 어떤 경우에도 실행되기 때문이다.