예외처리: throw와 throws
throw 키워드
throw 키워드는 프로그래머가 고의로 예외를 발생시키는 키워드이며, 연산자 new를 이용해서 발생시키려는 예외 클래스의 인스턴스를 생성시킨다.
예시
try{
throw new Exeption("고의로 예외 발생") // 예외 발생
}catch(Exception e){
System.out.println("에러 메시지:"+ e.getMessage());
e.printStackTrace();
}
System.out.println("프로그램 정상 종료");
출력 결과를 보면, throw키워드를 이용하여 Exception 예외를 고의로 발생시킨 것을 확인할 수 있다. throw 키워드는 일반적으로 개발자가 원하는 시점에서 예외를 생성하고 프로그램의 제어 흐름을 변경하는데 사용된다.
throws 키워드
throws 키워드는 메서드 선언부에 작성하며, 메서드 내에서 예외가 발생하는 경우 throws를 통해 메소드를 호출한 호출자에게 예외를 되던질 수 있도록 하는 키워드이다.
예시
public static void main(String[] args){
try{
method1();
}catch (Exception e){
System.out.println("main메서드에서 예외 처리");
e.printStackTrace();
}
}
public static void method1() throws Exception {// Exception 예외 되던지기
method2(); // method2 호출
}
public static void method2() throws Exception {
throw new Exception("예외 고의적으로 발생"); // 예외 발생
}
*참고* 위 예시코드에서는 throws에 예외를 하나만 명시했지만, 쉼표( , )로 구분하여 여러 개의 예외를 선언하는 것도 가능하다. |
예시 코드의 흐름은 아래 그림과 같다.
만약 main 메서드에서도 예외처리가 되지 않는다면 어떻게될까?
만약, main 메서드에서도 예외가 처리되지 않고, throws를 사용하여 예외를 전파한다면, 예외는 JVM에 의해 처리되어야 한다. JVM에 예외가 전파된 경우, JVM에서 예외를 기본 예외 처리기(Default Exception Handler)에 전달한다. 예외를 전달받은 기본 예외 처리기는 예외 정보를 출력하고 프로그램을 종료한다.
*참고* JVM의 기본 예외처리기는 Java 프로그램에서 예외가 처리되지 않은 경우 호출되는 일종의 마지막 보루이다. 개발자가 명시적으로 예외처리 코드를 작성하지 않았을 때 호출되며, 예외를 처리한 후 프로그램을 종료한다. |
예외 처리의 다형성
Java에서 예외는 클래스로 작성되어 있으므로, 다형성의 개념을 적용할 수 있다. 즉, 다형성을 활용하면 상위 예외 클래스 타입의 참조 변수로 여러 하위 예외 타입을 처리할 수 있어서 코드를 보다 유연하고 일반적으로 작성할 수 있다.
예시
try {
// ClassCastException 발생
// NullPointerException 발생
// ArithmeticException 발생
} catch (ClassCastException e) {
// ClassCastException 예외 처리
} catch (RuntimeException e) {
// NullPointerException, ArithmeticException 예외 처리
}
또 다른 예시
try {
} catch (NullPointerException e) {
// 동일한 예외처리코드
} catch (ArithmeticException e) {
// 동일한 예외처리코드
}
try {
// NullPointerException
// ArithmeticException
} catch (RuntimeException e) {
// 여러 exception 의 상위 타입으로 한번에 잡을 수 있음
// Throwable 까지만 가능
// 동일한 예외처리코드
}
public static void main(String[] args) throws Exception { // 상위 타입으로 throws 가능
method1();
}
public static void method1() throws ClassNotFoundException{
method2();
}
public static void method2()throws ClassNotFoundException {
}
위의 예시 코드들처럼 다형성 개념을 적용하여, 상위 클래스 예외 타입으로 코드를 간소화하고 일반화할 수 있다.
키워드 정리
키워드 | 설명 |
throw | - 프로그래머가 예외를 고의로 발생시키는 키워드 - 일반적으로 프로그램의 제어 흐름을 변경할 때 사용된다. |
throws | - 호출자에게 예외를 되던지는 키워드 - 호출자에게 예외를 처리하도록 한다. |