[Java 활용] 2.2 예외를 잡아서 처리하기

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