Java의 try와 catch
Java에서 메서드는 try와 catch 키워드를 조합하여 예외(exception)를 처리할 수 있습니다. try/catch 블록은 예외가 발생할 가능성이 있는 코드 주위에 배치되며, 예외 발생 시 프로그램이 비정상적으로 종료되는 것을 방지합니다.
try와 catch의 기본 문법은 다음과 같습니다.
try {
// 보호되는 코드 (예외가 발생할 수 있는 코드)
} catch (ExceptionName e1) {
// catch 블록 (예외 처리 코드)
}
catch 문에는 처리하고자 하는 예외의 타입을 반드시 선언해야 합니다. 보호된 코드에서 예외가 발생하면, try 블록 뒤에 위치한 catch 블록(또는 여러 개의 catch 블록)이 순서대로 검사됩니다. 이때 발생한 예외의 타입이 특정 catch 블록에 명시되어 있다면, 마치 메서드의 매개변수에 인자를 전달하듯 해당 예외 객체가 그 catch 블록으로 전달됩니다.
예제
다음은 try와 catch를 활용한 예외 처리 예제입니다.
import java.io.*;
public class Demo {
public static void main(String args[]) {
try {
int a[] = new int[5];
System.out.println("Access element eighth :" + a[7]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Exception thrown :" + e);
}
System.out.println("Out of the block");
}
}
실행 결과
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 7 Out of the block
위 예제에서 배열의 크기는 5이지만 인덱스 7번 요소에 접근하려고 하여 ArrayIndexOutOfBoundsException이 발생했습니다. 이 예외는 catch 블록에서 처리되었기 때문에 프로그램은 중단되지 않고 마지막 출력문까지 정상적으로 실행된 것을 확인할 수 있습니다.
Java의 throw와 throws
throws 키워드는 메서드가 checked 예외(검사 예외)를 직접 처리하지 않을 때, 해당 예외를 호출자에게 넘긴다는 것을 선언하는 데 사용됩니다. throws는 메서드 시그니처의 끝부분에 위치하며, 쉼표로 구분하여 여러 개의 예외 클래스를 동시에 선언할 수도 있습니다.
throw 키워드는 예외를 명시적으로 발생시킬 때 사용됩니다. 새로 생성한 예외 객체를 던질 수도 있고, 방금 catch한 예외를 다시 던질 수도 있습니다.
정리하면, throws는 checked 예외의 처리를 호출한 쪽으로 미루기 위해 사용되고, throw는 예외를 코드상에서 직접 발생시키기 위해 사용됩니다.
throw와 throws의 차이점
- throw: 메서드 내부에서 실제 예외 객체를 하나만 던질 때 사용합니다. (예:
throw new IOException();) - throws: 메서드 선언부에서 처리하지 않을 예외의 종류를 하나 이상 나열하여 선언할 때 사용합니다. (예:
void readFile() throws IOException { })