10-2 / 예외처리
예외처리란 프로그램에서 예외 발생시 프로그램이 갑자기 종료하는 것을 막고 정상 실행을 유지할 수 있도록 처리하는 것.
컴파일 때 체크하여 강제적으로 예외처리 코드 작성하도록 요구하는 일반 예외와 달리 실행 예외는 컴파일러가 체크해주지 않기 때문에 개발자의 경험으로 처리코드를 작성한다.
예외 처리 코드
try-catch-finally 블록은 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외처리를 할 수 있도로고 돕는다.
| try { |
| 예외 발생 가능 코드 ① |
| } catch (예외클래스 e) { |
| 예외처리 ② |
| } finally { |
항상 실행 ③ |
| } |
- try블록인 ①이 정상 실행되면 ②는 실행되지 않고 ③을 실행한다.
- try블록인 ①에서 예외가 발생하면 발생 즉시 ②가 실행되고 ② 종료후 ③이 실행된다.
- finally 블록은 생략이 가능하며, finally문을 사용하게 되면 try와 catch에 return문이 있어도 실행된다.
public static void main(String[] args){
String data1 = "5";
String data2 = null;
// ArrayIndexOutOfBoundsException 처리
try {
data1 = args[0];
data2 = args[1];
} catch (ArrayIndexOutOfBoundsException e){
System.out.println("실행 매개값 수 부족");
return;
}
// 실행 매개값 수 부족
// NumberFormatException
try{
int value1 = Integer.parseInt(data1);
int value2 = Integer.parseInt(data2);
int result = value1 + value2;
} catch (NumberFormatException e) {
System.out.println("숫자로 변환 불가");
} finally {
System.out.println("다시 실행하세요");
}
// 숫자로 변환 불가
// 다시 실행하세요
예외 종류에 따른 처리 코드
- 다중 catch
try블록내의 다양한 예외를 처리하기 위해 사용
| try { |
| 예외 발생 가능 코드 ① |
| } catch (예외클래스 e) { |
| 예외처리1 ② |
| } catch (예외클래스 e) { |
예외처리2 ③ |
| } |
블록이 여러개지만 먼저 만나는 예외에 따라 단하나의 catch블록이 실행된다.
- catch 순서
다중 catch블록 작성시 주의할 점은 상위 예외 클래스가 하위 예외 클래스 보다 아래쪽에 위치해야 한다.
catch문이 위에서 부터 차례로 체크되는데 하위 예외가 상위 예외를 상속하고 있어 상위 예외 클래스가 위에 위치하게 되면 상위 예외에도 적용되버려 정확한 예외처리가 불가능 하기 때문이다.
예외 떠넘기기
try-catch블록으로 예외를 처리하는 것이 기본이나 경우 따라서 throws키워드를 이용하여 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
throws 키워드 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘긴다.
리턴타입 메소드이름(매개변수, ...) throws 예외클래스1, 예외클래스2, ... {
}
// ----------------------- 모든 예외를 넘길시 가장 최상위 예외클래스인 Exception 사용
리턴타입 메소드 이름(매개변수, ...) throws Exception {
}
throws 키워드가 붙어 있는 메소드는 반드시 try블록 내에서 호출하여 catch 블록에서 떠넘겨진 예외를 처리해야한다.
public class ThrowsExample {
try {
findClass();
} catch(ClassNotFoundException e) {
Sytem.out.println("클래스가 존재하지 않습니다.");
}
}
public static void findClass() throws ClassNotFoundException {
Class clazz = Class.forName("java.lang.String2");
}
main()메소드에서도 throws 키워드를 사용해서 예외를 떠넘길 수 있는데, 결국 JVM이 최동적으로 예외 처리를 하게 됩니다. JVM은 예외의 내용을 콘솔에 출력하는 것으로 예외 처리를 합니다. (하지만 main()메소드에 바로 붙이는건 좋은 방법은 아니다.)
'Programming > Java' 카테고리의 다른 글
| 혼공자바] 12-1 멀티 스레드 (1) | 2022.12.15 |
|---|---|
| 혼공자바] 11 기본 API 클래스 (0) | 2022.12.14 |
| 제네릭(Generic) (0) | 2022.12.13 |
| 혼공자바] 10-1 예외 클래스 (0) | 2022.12.12 |
| 혼공자바] 09-2 익명 객체 (0) | 2022.12.10 |
