Java에서는 던져진 예외를 잡아서 처리하는 방법을 제공하고 있습니다. 먼저 개발자는 예외가 발생할 수도 있다고 생각하는 부분을 try 블록으로 지정하고 이어서 catch 블록을 지정하여 원하는 예외 개체를 잡아서 예외를 처리합니다.
try{
…예외가 발생할 수도 있는 코드
}
catch(예외 개체 변수명){
…예외를 잡아서 처리할 구문…
}
다음은 배열의 유효하지 않은 인덱스를 사용할 때 발생하는 ArrayIndexOutOfBoundsException을 던져졌을 때 개발자가 이를 잡아 처리하지 않았을 때의 코드와 출력 내용입니다. 참고로 모든 예외 클래스는 기반 클래스 Exception 에서 파생한 형식입니다.
▷ 소스 2.2 예외를 잡아서 처리하는 코드
//예외를 잡아서 처리 public class Program { public static void main(String[] args){ int[] arr = new int[3]; System.out.println("배열 생성"); try{ arr[4] = 7; System.out.println("arr[4]에 7 대입"); } catch(Exception ex){ System.out.println("예외 발생"); System.out.println(ex.toString()); } } }
▷ 소스 2.2 실행 결과
배열 생성 예외 발생 java.lang.ArrayIndexOutOfBoundsException: 4
출력 결과를 보는 것처럼 예외가 발생하면 이 후의 코드는 수행하지 않고 catch 블록을 진행하는 것을 알 수 있습니다. 그리고 catch 블록은 하나의 try 문 뒤에 여러 개가 올 수 있으며 이 때는 앞에 catch문부터 던져진 예외를 잡기를 시도합니다. 만약 하나의 catch 문에서 예외를 잡아서 처리하면 이 후의 catch 문은 예외를 잡지 못합니다.
따라서 여러분이 계층화 예외 클래스가 있을 때 catch 블록문은 파생 형식 개체를 잡는 부분을 앞쪽에 두어야 합니다. 다음은 ArrayIndexOutOfBoundsException이 발생했을 때 Exception 개체를 받는 catch 블록을 ArrayIndexOutOfBoundsException 개체를 받는 catch 블록보다 앞에 배치하였을 때 나오는 코드와 출력 내용입니다.
▷ 소스 2.3 기반 형식 예외 개체를 잡는 catch 블록을 앞에 두었을 때 코드
//기반 형식 예외 개체를 잡는 catch 블록을 앞에 두었을 때 public class Program { public static void main(String[] args){ int[] arr = new int[3]; System.out.println("배열 생성"); try{ arr[4] = 7; System.out.println("arr[4]에 7 대입"); } catch(Exception ex){ System.out.println("예외 발생"); System.out.println(ex.toString()); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("배열의 유효하지 않은 인덱스 사용 예외 발생"); System.out.println(e.toString()); } } }
▷ 소스 2.3 실행 결과
Exception in thread "main" java.lang.Error: Unresolved compilation problem: Unreachable catch block for ArrayIndexOutOfBoundsException. It is already handled by the catch block for Exception at Program.main(Program.java:15)
다음은 ArrayIndexOutOfBoundsException이 발생했을 때 ArrayIndexOutOfBoundsException 개체를 받는 catch 블록을 기반 형식 Exception 개체를 받는 catch 블록보다 앞에 배치하였을 때 나오는 코드와 출력 내용입니다.
▷ 소스 2.4 기반 형식 예외 개체를 잡는 catch 블록을 뒤에 두었을 때 코드
//기반 형식 예외 개체를 잡는 catch 블록을 뒤에 두었을 때 public class Program { public static void main(String[] args){ int[] arr = new int[3]; System.out.println("배열 생성"); try{ arr[4] = 7; System.out.println("arr[4]에 7 대입"); } catch(ArrayIndexOutOfBoundsException e){ System.out.println("배열의 유효하지 않은 인덱스 사용 예외 발생"); System.out.println(e.toString()); } catch(Exception ex){ System.out.println("예외 발생"); System.out.println(ex.toString()); } } }
▷ 소스 2.4 실행 결과
배열 생성 배열의 유효하지 않은 인덱스 사용 예외 발생 java.lang.ArrayIndexOutOfBoundsException: 4