[Error/Exception 계층 구조]
Checked Exception이란, 컴파일 시점에 컴파일러에 의해 확인되는 예외이다.
Exception은 개발자의 실수에 의해 발생하는 예외이다.
Java의 모든 객체들은 Object
를 최상단 부모로 갖는다.
Object
를 상속 받는 Throwable
은 Error
와 Exception
의 상위 클래스이다.
이 때 checked exception이란, 말 그대로 컴파일러에 의해 확인된 예외이다.
예를 들어 존재하지 않는 파일을 열려고 하면 FileNotFoundException
, 존재하지 않는 클래스에 접근하려고 할 때에 ClassNotFoundException
이 발생한다.
이러한 CheckedException
은 런타임 이전에 확인되므로, 컴파일러에서 반드시 해당 예외를 처리하도록 강제한다.
Java로 알고리즘 공부를 해 본 사람이라면, BufferedReader
를 사용한 경험이 있을 것이다. 또 BufferedReader
를 사용하면 반드시 처리해주어야 하는 Exception이 있다.
public void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
...
}
바로 IOException
이다. 위와 같이 입출력, 파일 입출력과 같은 Checked Exception은 모두 throws로 명시해주거나, try-catch 문을 사용하는 등의 예외 처리가 필수적이다.
Unchecked Exception은 런타임에 확인되는 예외이다.
Unchecked Exception은 실행 도중에 발생하는 예외로, RuntimeException
을 상속한다.
Unchecked Exception은 예외 처리를 강제하지 않는다.
그러나 Unchecked Exception은 대부분이 개발자가 예외 상황을 고려하지 않고 작성한 코드에서 발생한다.
따라서 서비스에 사용되는 서버를 개발할 때에는, 어디서 어떤 에러가 언제 발생했는지 파악하는 것이 중요하다.
이에 전역적인 에러 핸들러인 GlobalErrorHandler
를 정의하여 발생한 에러에 대한 정보를 파악하고, 클라이언트로 에러 정보를 정제하여 반환할 수 있도록 한다.
대표적인 Unchecked Exception은 ArrayIndexOutOfBounds
, NullPointerException
이 있다.
Unchecked Exception이 발생하면 프로세스의 종료로 이어질 수 있으므로, Unchecked Exception이 발생하는 상황을 명확히 인지하고 해결하는 것이 중요하다.