자바에서 throw
를 통해 발생시킬 수 있는 예외는 크게 3가지가 있다.
java.lang.Error
클래스의 서브 클래스들
주로 자바 VM에서 발생시킨다.
OutOfMemoryError나 ThreadDeath와 같은 에러는 catch 블록으로 잡아도 코드에서 대응할 수 있는 방법이 없다.
=> 시스템 레벨에서 특별한 작업을 하지 않는다면 애플리케이션에서는 신경쓰지 않아도 된다.
Exception
은 java.lang.Exception
클래스와 서브클래스로 정의된 것을 말한다.
Exception
은 RuntimeException
클래스를 상속하지 않은 체크 예외와 상속한 언체크 예외로 구분된다.
체크 예외는 catch
또는 throws
를 사용하지 않으면 컴파일 에러가 발생한다.
=> 체크 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다.
java.lang.RuntimeException
클래스를 상속한 예외들은 명시적인 예외처리를 강제하지 않는다.
주로 프로그램의 오류가 있을 때 발생하도록 의도된 것들이다.
(NullPointerException, IllegalArgumentException 등)
=> 런타임 예외는 개발자가 부주의해서 발생할 수 있는 경우에 발생하도록 만들어졌다.
체크 예외가 예외처리를 강제하기 때문에 예외 블랙홀이나 무책임한 throws 코드가 남발된다. 그래서인지 새로 등장하는 자바 표준 스펙 API는 예상 가능한 예외상황을 다루는 예외를 체크 예외로 만들지 않는 경향이 있다.
예외 상황을 파악하고 문제를 해결해서 정상 상태로 돌려놓는다.
다른 오브젝트나 메소드가 예외를 대신 처리할 수 있도록 던진다.
콜백 - 템플릿처럼 긴밀하게 역할을 분담하고 있는 관계가 아니라면 무책임한 책임 회피가 될 수 있으니 조심한다.
throws
문으로 선언해서 예외가 발생하면 알아서 던져지게 한다.catch
문으로 예외를 잡아서 로그를 남기고 다시 예외를 던진다.예외를 메소드 밖으로 던지는 것은 예외처리 회피와 동일하나, 예외를 그대로 넘기는 것이 아니라 적절한 예외로 전환
해서 던진다.