try 블록 내부에는 다양한 종류의 예외가 발생할 수 있는데, 이런 경우 다중 catch 블록을 작성할 수 있다.
catch 블록의 예외 클래스 타입은 try 블록에서 발생된 예외의 종류를 말하는데,
try 블록에서 해당 타입의 예외가 발생하면 catch 블록을 실행하도록 되어 있다.
catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행된다.
(try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고
해당 catch 블록으로 이동하기 때문)
다중 catch 코드
public class CatchByExceptionKindExample {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(value1 + "+" + value2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java TryCatchFinallyRuntimeExceptionExample num1 num2");
} catch (NumberFormatException e) {
System.out.println("숫자로 변환할 수 없습니다.");
} finally {
System.out.println("다시 실행해 주세요.");
}
}
}
다중 catch 블록 작성 시 주의할 점 :
하위 예외 클래스를 반드시 상위 예외 클래스의 위쪽에 작성해야한다!
try 블록에서 예외가 발생했을 때, 예외를 처리해줄 catch 블록은 위에서부터 차례로 검색된다.
만약 상위 예외 클래스의 catch 블록이 위에 있다면, 하위 예외 클래스의 catch 블록은 실행되지 않는다.
public class CatchOrderExample2 {
public static void main(String[] args) {
try {
String data1 = args[0];
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
System.out.println(value1 + "+" + value2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("실행 매개값의 수가 부족합니다.");
System.out.println("[실행 방법]");
System.out.println("java TryCatchFinallyRuntimeExceptionExample num1 num2");
} catch (Exception e) {
System.out.println("숫자로 변환할 수 없습니다.");
} finally {
System.out.println("다시 실행해 주세요.");
}
}
}
멀티 catch
만약 여러 예외의 처리 코드가 동일할 때 하나의 catch 블록에서 여러 개의 예외를 동시에 처리하도록 해준다.
catch 괄호() 안에 동일하게 처리하고 싶은 예외를 | 로 연결하면 된다.
public class MultiCatchExample {
public static void main(String[] args) {
try {
String data1 = args[0]; // ArrayIndexOutOfBoundsException
String data2 = args[1];
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2); // NumberFormatException
int result = value1 + value2;
System.out.println(value1 + "+" + value2 + "=" + result);
} catch (ArrayIndexOutOfBoundsException | NumberFormatException e) {
System.out.println("실행 매개값의 수가 부족하거나 숫자도 변환할 수 없습니다.");
} catch (Exception e) {
System.out.println("알 수 없는 예외 발생");
} finally {
System.out.println("다시 실행하세요.");
}
}
}
'개발 공부 > JAVA' 카테고리의 다른 글
예외 떠넘기기 (throws) (0) | 2021.06.18 |
---|---|
자동 리소스 닫기(try-with-resources) (0) | 2021.06.18 |
예외 처리 코드(try-catch-finally 블록) (0) | 2021.06.18 |
실행 예외 (RuntimeException) 종류 (0) | 2021.06.18 |
예외(Exception) (0) | 2021.06.18 |