메소드 내부에서 예외가 발생할 수 있는 코드를 작성 시 try - catch 블록으로 예외를 처리하는 것이
기본이지만, 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수 있다.
throws 키워드 : 메소드 선언부 끝에 작성, 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
형태
리턴타입 메소드명(매개변수선언1, . . . ) throws 예외클래스1, 예외클래스2, . . . {
. . .
}
발생할 수 있는 예외를 종류별로 throws 뒤에 나열하는 것이 일반적이지만,
Exception (상위 예외 클래스) 만으로 모든 예외를 간단히 떠넘길 수 있다.
형태
리턴타입 메소드명(매개변수선언1, . . . ) throws Exception {
. . .
}
throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야 한다.
그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.
method1() 에서도 try – catch 블록으로 예외 처리하지 않고 throws 키워드로 다시 예외를 떠넘길 수 있다.
그러면 method1()을 호출하는 곳에서 결국 try – catch 블록을 사용해서 예외 처리를 해야 한다.
public void method1() throws ClassNotFoundException { // 또 다른 try – catch 블록에서 예외 처리
method2();
}
자바 API 도큐먼트에서 클래스 생성자와 메소드 선언부에 throws 키워드가 붙어있는 경우,
이러한 생성자와 메소드를 사용하려면 반드시 try - catch 블록으로 예외 처리를 해야 한다.
아니면, throws 를 다시 사용해서 예외를 호출한 곳으로 떠넘겨야 한다.
그렇지 않으면 컴파일 에러가 발생한다.
예) 자바 API 도큐먼트에서의 Class 의 forName() 메소드
forName 선언부
public static Class<?> forName(String className) throws ClassNotFoundException
메소드 선언부 맨 뒤에 throws ClassNotFoundException 이 붙어있기 때문에,
forName() 메소드를 호출 시 try - catch 블록으로 예외 처리를 하거나,
throws 로 예외를 떠넘겨야 한다.
ex) ThrowsExam.java : 예외 떠넘기기
public class ThrowsExam {
public static void main(String[] args) {
try {
findClass();
} catch(ClassNotFoundException e) {
System.out.println("클래스가 존재하지 않습니다.");
}
}
public static void findClass throws ClassNotFoundException {
Class clazz = Class.forName("java.lang.String2"); // 예외 발생! throws!
}
}
main() 메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있다.
public static void main(String[] args) throws ClassNotFoundException {
findClass();
}
JVM 이 최종적으로 예외 처리를 하게 된다.
JVM 은 예외 내용을 콘솔(console)에 출력하는 것으로 예외 처리를 한다.
프로그램 사용자는 알 수 없는 예외 내용 출력을 좋아하지 않기 때문에,
main() 메소드에 throws Exception 을 붙이는 것은 좋지 않다.
따라서 main() 메소드에서 try - catch 블록으로 예외를 최종 처리하는 것이 바람직하다.
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 8. 예외 처리' 카테고리의 다른 글
5. Java 자바 [예외 처리] - 사용자 정의 예외와 예외 발생 시키기, 예외 정보 얻기 (0) | 2020.09.14 |
---|---|
3. Java 자바 [예외 처리] - 자동 리소스 닫기 try - with - resource 문 (0) | 2020.09.14 |
2. Java 자바 [예외 처리] - 예외 처리 코드 try-catch-finally 문 (0) | 2020.09.13 |
1. Java 자바 [예외 처리] - 예외와 예외 클래스 (0) | 2020.09.13 |