프로그램을 작성할때 프로그램의 흐름상 올바르지 못한 상황이 발생하면 프로그램을 종료하거나 특정한 행동을 해야하는 경우가 존재합니다. 이때 자바는 Exception 과 그 하위 클래스들을 제공하여 올바르지 못한 상황을 표현할 수 있도록 지원합니다.

자바는 크게 다음 두가지 예외로 분류할 수 있습니다.
두 객체는 모두 Throwable class 를 상속 받습니다. Throwable class 내부에는 아래 필드가 존재합니다.
private String detailMessage;
우리가 Exception 과 하위 클래스의 인스턴스를 생성할 때 메시지를 넣을 수 있는데 저장되는 곳이 바로 Throwable 의 detailMaessage 필드입니다.
Exception class 와 하위 class 들을 체크예외라고도 부릅니다. 이때 RuntimeException 은 제외됩니다.
public class CustomCheckException extends Exception {
public CustomCheckException(String message) {
super(message);
}
}
Exception 을 상속받아 클래스를 작성할 경우 해당 클래스는 체크 예외 클래스가 됩니다.
public void run(String value) throws CustomCheckException{
if (value.equals("error") {
throw new CustomCheckException();
}
System.out.println("success logic");
}
체크 예외를 발생시킬 경우 메서드 옆에 throws 키워드를 통해 어떤 예외가 메서드 밖으로 나가는지 명시해야합니다.
반드시 밖으로 나가는 예외를 명시해야하기 때문에 개발자가 실수로 예외를 누락하지 않도록 도와줍니다. 또한 어떤 예외가 발생하는지 알기 쉽게해준다는 장점이 존재합니다.
하지만 예외를 모두 신경써야하기 때문에 번거로울 수 있습니다.
RuntimeException 은 Exception 을 상속받지만 컴파일러가 예외를 체크하지 않습니다. 따라서 언체크 예외라고도 부릅니다.
public class CustomUncheckException extends RuntimeException{
public CustomUncheckException(String message) {
super(message);
}
}
RuntimeException을 상속받는 클래스들은 모두 언체크 예외가 됩니다.
public void run(String value) {
if (value.equals("error") {
throw new CustomUnCheckException();
}
System.out.println("success logic");
}
언체크 예외는 컴파일러가 예외체크를 하지 않습니다. 따라서 throws키워드를 생략할 수 있습니다. 만약 발생하는 예외가 정말 중요한 예외일 경우 명시적으로 예외를 적어주어도 됩니다.
public void run(String value) throws CustomUnCheckException{
if (value.equals("error") {
throw new CustomUnCheckException();
}
System.out.println("success logic");
}
이러한 생략 기능 덕분에 개발자는 신경쓰고 싶지 않은 예외를 무시할 수 있습니다. 하지만 내부에서 발생하는 예외를 실수로 누락할 수 있기 때문에 주의해야 합니다.