자바 컴파일러는 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제적으로 예외 처리 코드를 작성하도록 한다.
그러나 실행 예외는 컴파일러가 체크하지 않기 때문에 개발자가 직접 예외 처리 코드를 작성해야 한다.
<try-catch-finally>
try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성하여 예외가 발생할 경우 예외 처리를 할 수 있도록 한다.
try-catch-finally 블록 작성은 다음과 같다.
각 블록 별 특징은 다음과 같다.
- try 블록(1) : 예외 발생 가능 코드 위치
- catch 블록(2) : 예외 처리 코드 위치. 예외 발생 없이 정상 실행되면 실행되지 않음. 반대로 try 블록의 코드에서 예외가 발생하면 발생 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행
- finally 블록(3) : 생략 가능. 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성. try블록과 catch 블록에 return문이 있더라도 실행
(Tip)
이클립스를 사용할 경우 일반 예외가 발생할 가능성이 있는 코드를 작성하면 빨간 밑줄을 그어 예외 처리 코드의 필요성을 알려준다. 또한 마우스 포인터를 가져다 놓으면 처리되지 않은 예외의 정보를 알 수 있다.
<다중 catch>
try 블록 내부에는 다양한 예외가 발생할 수 있으며 발생하는 예외별로 예외 처리 코드를 다르게 해야할 수 있다.
이런 경우에 사용하는 것이 다중 catch 블록이다.
다중 catch 블록은 예외 클래스 타입 별로 catch 블록을 작성하며, try 블록에서 해당 타입의 예외가 발생하면 해당 타입의 catch 블록을 실행한다.
그 이유는 try 블록에서 동시에 예외가 여러 개 발생하지 않으며, 하나의 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하기 때문이다.
다중 catch 블록을 작성할 때 주의해야할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것이다.
try 블록에서 예외가 발생하면 catch 블록의 위에서부터 차례대로 검색한다.
만약 상위 예외 클래스의 catch 블록이 위에 있다면 하위 예외 클래스의 catch 블록은 실행되지 않는다.
<throws>
예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 일반적이다.
하지만 경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
이럴 때 throws 키워드를 사용하며, 메소드 선언부 끝에 작성하여 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열한다.
리턴타입 메소드이름(매개변수, ...) throws 예외클래스1, 예외클래스2, ... { }
발생할 수 있는 예외의 종류별로 나열하는 것이 일반적이나, throws Exception만으로 모든 예외를 간단하게 떠넘길 수도 있다.
리턴타입 메소드이름(매개변수, ...) throws Exception { }
throws 키워드가 붙은 메소드는 반드지 try 블록 내에서 호출되어야 한다.,
그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.
다음 코드는 throws 키워드가 있는 bbb()를 aaa()에서 호출하는 예시이다.
public void aaa() {
try {
bbb();
} catch(ClassNotFoundException e) {
//예외 처리 코드
System.out.println("클래스가 존재하지 않습니다.");
}
}
public void bbb() throws ClassNotFoundException {
Class clazz = Class.forName("java.lang.String2");
}
aaa()에서도 try-catch 블록으로 예외를 처리하지 않고 다음과 같이 throws 키워드로 다시 예외를 떠넘길 수 있다.
그러면 aaa()를 호출하는 곳에서 try-catch 블록을 사용해서 예외를 처리해야 한다.
public void aaa() throws ClassNotFoundException {
bbb();
}
'프로그래밍언어 > Java' 카테고리의 다른 글
11-1 java.lang 패키지(2) (0) | 2022.03.02 |
---|---|
11-1 java.lang 패키지(1) (0) | 2022.02.23 |
10-1 예외 클래스 (0) | 2021.12.27 |
09-2 익명 객체 (0) | 2021.12.14 |
09-1 중첩 클래스와 중첩 인터페이스 소개 (0) | 2021.06.29 |