try : 시도하다
catch : 잡다
finally : 마침내
일단 try해 ~~ 그리고, 예외가 발생하면 그걸 잡아!!(catch), 그리고 정상적으로 수행되든, 예외가 발생하든 결국, 마침내 수행돼야 하는 로직을 ‘finally’ 수행해!!
try{
} catch() {
} finally() {
}
예외 클래스를 만들어 예외를 정의
class OurBadException extends Exception {
public OurBadException() {
super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
}
}
클래스를 만들고, 메서드를 만들며 우리의 메서드가 위험하다고 알리기(throw, throws)
class OurClass {
private final Boolean just = true;
// 신규 문법 throws : 예외를 던지다/발생시키다.
public void thisMethodIsDangerous() throws OurException {
if (just) {
// 신규 문법 throw : OurException을 던져라
throw new OurException();
}
}
}
우리가 위험한 메서드를 사용한다면, 예외를 handling 하기
public class StudyException {
public static void main(String[] args) {
OurClass ourClass = new OurClass();
try {
// 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
// "시도" 해보는 코드가 들어가는 블럭입니다.
ourClass.thisMethodIsDangerous();
} catch (OurException e) {
// 2. 예외가 발생하면, "잡아서" handling 합니다.
// 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
// 여기 있는 catch 블럭 내의 코드가 실행됩니다.
System.out.println(e.getMessage());
} finally {
// 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
// 무조건 실행되는 코드가 들어가는 블럭입니다.
System.out.println("우리는 방금 예외를 handling 했습니다!");
}
}
}
예외는 다른 예외를 유발할 수 있다.
예외를 연결하는 이유 : 여러 가지 예외를 하나의 큰 분류의 예외로 묶어서 다루기 위함
Checked Exception을 Unchecked Exception으로 포장(Wrapping)하는데 유용하게 사용
initCause() : 지정한 예외를 원인 예외로 등록하는 메서드
getCause() : 원인 예외 반환 메서드
→ 원인에 대한 tracking이 편하다.