JAVA 예외처리 (검사되지 않은 예외, 검사된 예외)
시작하기 앞서
학교 수업에서 예외처리는 항상 중요하다 강조했었고 라이브러리를 사용하다 try catch로 처리해야 한다는 상황도 있었다.
그때마다 try catch로 발생하는 예외에 대해 처리만 하면 끝이라는 생각을 갖고 있었고 실제로 그렇게 예외처리를 했었다.
그래서 이번기회에 관심을 갖고 조금 더 자세히 알아본 내용을 포스팅으로 작성하겠다.
1. 예외처리 문법(try-catch)
try {
} catch(Exception e) {
} finally {
}기본적으로 JAVA를 처음 배우게되면 책이나 수업에서 예외처리에 대한 문법을 배운다.
try에선 예외 발생 가능성이 있는 로직을 작성하고 catch에선 해당 예외를 잡아 처리한다.
finally는 try-catch 구문이 끝나면 무조건 실행되는 영역이다.
2. 예외 계층

위 그림을 보면
Throwable 클래스 에서 Exceptions와 Error로 두가지 분기로 나눠진다.
예외는 try-catch를 사용하여 처리할 수 있는 영역이고
에러는 try-catch로 처리할 수 없는 영역이다.
(Out of memory, Stack overflow 기타등등..)
그리고 검사된 예외(Checked Exceptions)와 검사되지 않은 예외(Unchecked Exceptions)에 예시가 적혀있다.
3. 검사된 예외(Checked Exceptions)
검사된 예외는 우리가 개발할 때 프로그램 실행전에 IDE에서 빨간줄로 try-catch로 감싸줘야 한다는 문구가 나오는 경우라고 보면 될것같다.

위의 IOException은 검사된 예외로 try-catch구문으로 감싸서 예외 처리를 해야한다.
컴파일러가 예외처리를 강제하기 때문이다.
4. 검사되지 않은 예외(UnChecked Exceptions)
검사되지 않은 예외는 프로그램 실행중 발생하는 예외이고 개발자의 실수 때문에 발생할 수 있는 예외로 컴파일러가 예외처리를 강제하지 않는다.
그러나 충분히 예측가능한 영역이기 때문에 예측되는 예외 발생지점에서 예외처리를 해주자.

위의 NullPointerException은 try-catch를 사용하라는 문구가 나오지 않는다.
5. 예외 전파(Exception Propagation)
검사된 예외
예외가 발생하는 지점에서 try-catch를 이용하여 예외를 처리하거나 c함수를 호출하는 b함수내에서 예외를 처리하기 위해 c함수에 시그니처를 추가한다.

아래와 같이 예외를 계속 미룰수도 있다.

검사되지 않은 예외

위 c함수에서 NPE를 발생시켰지만 IDE에선 c함수를 호출하는 b함수에서 컴파일러 에러가 표시되지 않고있다.

프로그램이 실행은 되지만 런타임예외 발생으로 종료되게 된다.
따라서 a, b, c 각자의 비즈니스 로직에서 알맞다고 생각하는 위치에서 try-catch 구문을 이용하여 예외처리를 해주도록 하자.
또한 메서드에 예외 시그니처를 추가하여 다른사람이 해당 함수를 봤을때 예외가 발생할 수 있다는 점을 코드에서 직관적으로 알 수 있도록 하자.
마무리
예외 체이닝과 커스텀 예외클래스 try-with-resources 등 예외처리에 관한 다른 내용도 존재한다.
나는 위에서 내가 다룬 내용이 예외처리의 근간이 되는 내용이라 생각하여 추가 정보에 대해서는 다루지 않았다.
개인적으로 위의 내용만 알아도 예외처리에 대해 충분히 대응할 수 있을거라 생각된다.