이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. 사용자 정의 예외 만들기
- 우리가 직접 예외 클래스를 정의할 수 있다.
- 조상은 Exception과 RuntimeException중에서 선택
class MyException extends Exception {
MyException(String msg) { // 문자열을 매개변수로 받는 생성자
super(msg); //조상인 Exception클래스의 생성자를 호출한다.
}
}
class MyException extends Exception {
//에러 코드 값을 저장하기 위한 필드를 추가 했다.
private final int ERR_CODE; //생성자를 통해 초기화 한다.
MyException(String msg, int errCode) { //생성자
super(msg);
ERR_CODE = errCode;
}
MyException(String msg) { //생성자
this(msg, 100); //ERR_CODE를 100(기본값)으로 초기화한다.
}
public int getErrCode() { //에러 코드를 얻을 수 있는 메서드도 추가했다.
return ERR_CODE; //이 메서드는 주로 getMessage()와 함께 사용될 것이다.
}
}
2. 예외 되던지기 (exception re-throwing)
- 예외를 처리한 후에 다시 예외를 발생시키는 것
- 호출한 메서드와 호출된 메서드 양쪽 모두에서 예외처리하는 것
분담처리해야 할 때 사용. 한 쪽이 일부 처리하고 남은 한 쪽이 남은 부분을 처리하는
⍟실습
더보기
Ex8_12
class Ex8_12 {
public static void main(String[] args) {
try {
method1();
} catch (Exception e) {
System.out.println("main메서드에서 예외가 처리되었습니다.");
}
} // main메서드의 끝
static void method1() throws Exception {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("method1메서드에서 예외가 처리되었습니다.");
throw e; // 다시 예외를 발생시킨다.
}
} // method1메서드의 끝
}
결과
method1메서드에서 예외가 처리되었습니다.
main메서드에서 예외가 처리되었습니다.
3. 연결된 예외(chained exception)
- 한 예외가 다른 예외를 발생시킬 수 있다.
- 예외 A가 예외 B를 발생시키면, A는 B의 원인 예외 (cause exception)
Throwable initCause(Throwable cause)
지정한 예외를 원인 예외로 등록
Throwable getCause()
원인 예외를 반환
public class Throwable implements Serializable {
...
private Throwable cause = this; //객체 자신(this)을 원인 예외로 등록
...
public synchronized Throwable initCause(Throwable cause) {
...
this.cause = cause; //cause를 원인 예외로 등록
return this;
}
...
}
예외 안에 또 다른 예외를 포함 시킴
SpaceException e는 예외 A
IntsallException은 예외 B
그래서 새로운 예외B를 만들고, 예외 A를 예외 B의 원인 예외로 initCause()를 이용해서 만든다.
예외B.initCause(예외A);
사용 이유
1. 여러 예외를 하나로 묶어서 다루기 위해서
예외가 많아지면 catch블럭이 많아진다. 이게 부담스러워서 위 코드를 아래 코드처럼 하나의 catch블럭으로 만들려고 할 때, 연결된 예외를 사용한다.
아래 코드처럼 만들려면 install() 메소드 안에 catch블럭을 집어넣어야 한다.
바뀐 코드가 더 보기 좋다. 대략적인 정보와 세부정보를 차례로 보여주기 때문이다.
2. checked예외를 unchecked예외로 변경하려 할 때
SpaceException은 Exception의 자손. 즉, Checked Exception이다.
그렇다면 이것을 unchecked로 만들고 싶으면 extends RuntimeException으로 바꾸는 방법도 있다.
하지만! 이미 SpaceException을 다른 곳에서 많이 쓰고 있다고 하면 이와 같이 바꾸기 어렵다.
이럴 때 연결된 예외를 이용해서 만드는 것이다. 그래서 runtimeException안에다 MemoryException을 안에 집어넣는다. 그래서 runtime이 발생한 것처럼 위장한다.
<사진2-2>를 보면 throws에 <사진2-1>과는 달리 MemoryException이 없다. 그 이유는 RuntimeException의 자손이 되어서 unchecked Exception이 되어서 굳이 쓸 필요가 없기 때문.
여기서는 생성자를 이용해서 원인예외를 등록했다. (initCause()사용 X)
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]Object클래스와 equals() (0) | 2024.02.29 |
---|---|
[JAVA의 정석]hashCode(), toString() (0) | 2024.02.28 |
[JAVA의 정석]예외발생시키기 (0) | 2024.02.28 |
[JAVA의 정석] 프로그램오류. try-catch (0) | 2024.02.18 |
[JAVA의 정석]열거형 (0) | 2024.01.19 |