- 한 예외가 다른 예외를 발생시킬 수 있다.
- 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외(cause exception)
Throwable initCause(Throwable cause) : 지정한 예외를 원인 예외로 등록 // initCause : 메소드, Throwable : Exception과 Error의 조상, cause : 원인예외를 저장하기 위한 변수 Throwable getCause() : 원인 예외를 반환
- 원인 예외 : SpaceException
- 새로운 예외 생성 : InstallException
→initCause
메소드로 예외ie
의 원인예외로e
를 지정해줌.
→ ie와 e를 '연결된 예외'라고 함.- catch문은 예외를 처리해준 것이 아니라, 예외를 생성하고 연결했음.
그리고 원인 예외를 '새로 만든 예외'에 포함시키고 throw로 예외를 발생시켰음.
↳ 발생시킨 예외가InstallException
이기 때문에, 맨위에 install 메소드에 throws를SpaceException
이 아닌InstallException
으로 써준 것.
연결된 예외를 만드는 이유 1번
1) 여러 예외를 하나로 묶어서 다루기 위해서
- try-catch 문에서 메소드를 실행시킬 때, 예외가 너무 많으면 catch블럭이 엄청 많아짐
→ 메소드를 쓸 때마다 많은 catch블럭들을 다 써주기가 부담스러움.
→ 예외 catch블럭을 메소드 내로 넣고, 예외를 생성해서 예외들을 연결 시켜줌
→ 다음에 메소드를 호출할때에는 새로 생성한 예외 1개만 부르면 되도록 간단하게 만들어줌.
- install 메소드를 호출 할 때,
SpaceException
이랑MemoryException
을 계속 써주기 부담스러움- install 메소드 내에 예외를 생성(
InstallException
)해서SpaceException
,MemoryException
을 원인예외로 넣어줌.- install 호출 할 때는 throws 로 선언해준
InstallException
만 써주면 됨.- 세부적인 예외처리는 메소드 내로 넣어주는 것임.
↳ 예외를 연결시켜주지 않았을 때e.printStackTrace()
로 보여지는 결과
↳ 예외를 연결시켜줬을 때e.printStackTrace()
로 보여지는 결과
↳ 발생 예외(대략적인 정보) 와 원인 예외(세부정보)가 보기 쉽게 출력됨
연결된 예외 이유 2번
2) checked 예외(Exception, 필수처리)를 unchecked예외(RuntimeException, 선택처리)로 변경하려 할 때!
→ 필수처리예외면 try-catch를 꼭 써줘야 하기 때문에 코드짤 때 너무 길어지고 불편함.
⇒ RuntimeException을 만들고 그 안에 Exception예외를 원인 예외로 등록throw new MemoryException("메모리가 부족합니다."); // 아래와 같이 변경 ⬇︎ throw new RuntimeException(new MemoryException("메모리가 부족합니다."));
출처
- 자바의 정석 기초편 : ch 8- 18