728x90
예외 A가 예외 B를 발생시켰다면 예외 A는 예외 B의 원인 예외다.
1. 예외 연결 방법
예외를 연결하는 방법에는 두 가지가 있다.
1) Throwable 클래스의 initCause 메서드 사용
다음 상속 계층도를 참고하면 모든 Exception의 최고 조상은 Throwable이기 때문에 Throwable 클래스의 initCause 메서드 사용하면 예외를 연결할 수 있다.
[예 1]
try {
startInstall();
copyFiles();
} catch (SpaceException se)
InstallException ie = new InstallException("설치 중 예외 발생");
ie.initCause(se);
throw ie;
} catch (MemoryException me {
...
6번째 줄을 보면 SpaceException이 원인 예외 그 결과로 InstallException 예외를 발생한다.
2) 원인 예외로 감싸기
static void startInstall() throws SpaceException, MemoryException {
if(!enoughSpace())
throw new SpaceException("설치할 공간이 부족합니다.");
if(!enoughMemory())
throw new MemoryException("메모리가 부족합니다.");
}
static void startInstall() throws SpaceException {
if(!enoughSpace())
throw new SpaceException("설치할 공간이 부족합니다.");
if(!enoughMemory())
throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
}
두 코드 블럭의 차이점을 보면 RuntimeException이 원인 예외, MemoryException이 결과가 된다.
2. 예외 연결의 이유
(1) 여러 예외들을 하나의 큰 예외로 묶어서 다루기 위함
(2) checked 예외를 unchecked 예외로 바꾸기 위함
(1)을 물론 여러 예외 클래스들을 하나의 조상 예외 클래스로 묶어 다룰 수도 있겠지만 예외가 발생했을 때 어떤 자손 클래스에서 예외가 발생했는지 알기에 어렵고, 상속 관계를 변경해야 하는 점 또한 번거롭다. 위 코드 블럭은 (2)를 반영하는 예이다.
반응형
'자바 (Java) > 요약' 카테고리의 다른 글
Chpt 9. java.lang 패키지, util 클래스 - 주제 2. String vs. StringBuffer 클래스 (1) | 2023.11.03 |
---|---|
Chpt 9. java.lang 패키지, util 클래스 - 주제 1. Object 클래스 (0) | 2023.11.03 |
Chpt 8. 예외 - 주제 2. 예외의 처리 (1) | 2023.11.01 |
Chpt 8. 예외 - 주제 1. 프로그램 오류의 종류 (0) | 2023.11.01 |
Chpt 7. 객체 지향 프로그래밍 2 - 주제 6. 내부 클래스 (0) | 2023.10.28 |