[태그:] <span>catch</span>

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

Java 활용