자바에서 말하는 예외 처리란 프로그래머가 기대하고 작성한 기능대로 작동하지 않고 예상치 못하게 프로그램이 동작하는 것을 의미합니다.
자바는 예외가 발생하면 실행중이던 코드를 중단하고 해당 예외를 먼저 처리하게 됩니다. 이러한 예외들은 아주 다양하게 존재합니다.
아주 간단한 예시로 배열의 크기를 넘어가는 인덱스를 참조하거나(ArrayIndexOutOfBoundsException), 나누기를 할 때 0으로 나누는 경우 등이 있습니다(ArithmeticException).
이 외에도 수많은 예외가 존재하는데, 이러한 예외 클래스들은 공통적으로 최상위 부모로 (Object 클래스 제외) Throwable 이라는 클래스를 상속받고 있습니다.
💡 Throwable 클래스의 메소드
public String getMessage(): 예외의 원인을 담고 있는 문자열을 반환
public void printStackTrace(): 예외가 발생된 위치와 호출된 메소드들의 정보를 출력
자바에서 Exception이 발생 가능한 경우에는 두가지 행동을 취할 수 있습니다.
- 직접 예외를 처리하기 - try, catch 문 사용
- 호출 했던 메소드에 넘기기 - throws 사용
class IOExceptionCase {
public static void main(String[] args) {
try {
method1();
}
catch(IOException e) {
e.printStackTrace();
}
//... 다음 코드 이어서 실행
}
public static void method1() throws IOException {
method2();
}
public static void method2() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine(); // IOException 발생 가능
}
}
위와같은 코드의 예시에서 BufferedReader를 통해 readLine()을 하는 부분에서 IOException이 발생할 가능성이 있어 해당 예외를 처리하고 있습니다.
우선 , br.readLine()에서 예외가 발생했다고 가정하면, 해당 라인은 try문으로 감싸져 있지 않아 예외를 직접 처리할 수 없어 throws로 해당 메소드(method2)를 호출했던 곳으로 예외를 넘기게 됩니다.
method1 에서 해당 method2를 호출하고 있기 때문에 해당 라인이 또한 예외처리를 해야하는데 try문에 감싸져있지 않기 때문에 역시 method1을 호출했던 main으로 예외 처리를 떠넘기게 됩니다. 이후 main에서 try,catch 문을 통해 예외를 처리하고 남은 코드를 이어 처리하는 순서로 흘러가게 됩니다.
💡 만약 맨처음 호출되는 main 메소드에서도 예외를 throws를 통해 밖으로 넘기면 어떻게 될까요??
main 에서도 throws로 예외를 넘기게 만들었다면, main은 이전에 호출된 메소드가 없어 JVM에게 예외처리를 넘기게 되고, JVM은 printStackTrace() 메소드를 호출시키고 프로그램을 종료시킵니다.