체크 예외와 언체크 예외에 대해서 살펴보자.
Exception
과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다. 단, RuntimeException
은 그렇지 않다.
체크 예외는 잡아서 처리하거나, 밖으로 던지도록 선언해야 한다. 그렇지 않으면 컴파일 오류가 발생한다.
public class CheckedException extends Exception {
public CheckedException(String message) {
super(message);
}
}
Exception
을 상속받아서 CheckedException
은 체크예외가 된다.
super(message)
로 전달한 메시지는 Throwable
에 있는 detailMessage
에 보관 되고, getMessage()
로 조회할 수 있다.
public class Client {
public void call() throws CheckedException {
throw new CheckedException("exception");
}
}
throw
: 예외 발생 시키기 (폭탄 터뜨리기)
throws
: 예외 던지기 (폭탄 던지기)
public class Service {
Client client = new Client();
public void callCatch() {
try {
client.call();
} catch (CheckedException e) {
System.out.println("Exception Handling, message=" + e.getMessage());
}
System.out.println("Normal Flow");
}
public void callThrow() throws CheckedException {
client.call();
}
}
public class ExceptionMain1 {
public static void main(String[] args) {
Service service = new Service();
service.callCatch();
System.out.println("Normal Termination");
}
}
Exception Handling, message=exception
Normal Flow
Normal Termination
public class ExceptionMain2 {
public static void main(String[] args) throws CheckedException {
Service service = new Service();
service.callThrow();
System.out.println("Normal Termination");
}
}
Exception in thread "main" exception.basic.checked.CheckedException: ex
at exception.basic.checked.Client.call(Client.java:5)
at exception.basic.checked.Service.callThrow(Service.java:28)
at exception.basic.checked.ExceptionMain2.main(ExceptionMain2.java:7)
장점
개발자가 실수로 예외를 노락하지 않도록 컴파일러를 통해 문제를 잡아준다.
이로써 개발자는 어떤 체크 예외가 발생하는지 쉽게 파악할 수 있다.
단점
개발자가 모든 체크 예외를 반드시 잡거나 던지도록 처리해야 하기 때문에 번거롭다.
RuntimeException
과 그 하위 예외는 언체크 예외로 분류된다.
언체크 예외는 컴파일러가 예외를 체크하지 않으며, throws
를 선언하지 않아도 자동으로 예외를 던진다.
체크 예외는 throws
를 항상 선언해야 한다!!
public class UnCheckedException extends RuntimeException {
public UnCheckedException(String message) {
super(message);
}
}
public class Client {
public void call() {
throw new UnCheckedException("exception");
}
}
public class Service {
Client client = new Client();
public void callCatch() {
try {
client.call();
} catch (UnCheckedException) {
System.out.println("Exception Handling, message=" + e.getMessage());
}
System.out.println("Normal Flow");
}
public void callThrow() {
client.call();
}
}
결과는 체크 예외와 동일하다.
장점
신경쓰고 싶지 않은 언체크 예외를 무시할 수 있다.
throw
를 생략할 수 있다.
단점
개발자가 실수로 예외를 누락할 수 있다.
이펙티브 자바의 저자 조슈아 블로크(Josh Bloch)는 "현대 애플리케이션 개발에서는 체크 예외를 거의 사용하지 않는다."라고 말했다.
참고
김영한의 실전 자바 - 중급 1편
Class Exception
Class RuntimeException