Java Adv 03 - Thread 3
in Programming Language on Java
채크 예외 재정의
- Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptionException 체크 예외를 밖으로 던질 수 없는 이유를 알아보자
package thread.control;
public class CheckedExceptionMain {
public static void main(String[] args) throws Exception {
throw new Exception();
}
static class CheckedRunnable implements Runnable {
@Override
public void run() {
throw new Exception();
}
}
}
- 자바에서 메서드를 재정의 할 때, 재정의 메서드가 지켜야할 예와와 관련 규칙이 있다.
체크예외
- 부모 메서드가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크예외를 던질 수 없다.
- 자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.
언체크 예외
- 예외 처리를 강제하지 않으므로 상관없이 던질 수 있다.
자바는 왜 이런 제약을 두는 걸까?
- 부모 클래스의 메서드를 호출하는 클라이언트 코드는 부모 메서드가 던지는 특정 예외만을 처리하도록 작성한다. 자식 클래스가 더 넓은 예외의 범위를 던지면 해당 코드는 모든 예외를 제대로 처리하지 못할 수 있다.
- 예외 처리의 일관성을 해치고, 예상하지 못한 런타임 오류가 발생할 수 있다.
- ex) 예를 들어서 만약 부모가 InteruptException을 던지면 자식은 Exception을 던질 수 없다. 왜냐?
- InteruptException은 Exception의 자식이기 때문이다. 예외도 부모와 자식관의 범주를 정해놓고 그 해당 범위 내에서만 예외가 적용됨을 알 수 있다.
예시코드
public class Test{
public static void main(String[] args){
Parent p = new Child(); //인스턴스는 자식이지만 참조는 Parent이다.
try {
p.method();
} catch(InterruptedException e) {
}
}
}
- 자식 클래스의 재정의된 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.
- 원래 메서드가 체크 예외를 던지지 않는 경우, 재정의된 메서드도 체크 예외를 던질 수 없다.
안전한 예외처리
- 체크 예외를 run() 메서드에서 던질 수 없도록 강제함으로써, 개발자는 반드시 체크 예외를 try-catch 블록 내에서 처리하게 된다.
- 프로그램이 비정상으로 종료되는 상황을 방지할 수 있다.
- 멀티스레딩 환경에서는 예외 처리를 강제함으로써 스레드의 안정성과 일관성을 유지할 수 있다.
- 최근에는 체크예외 보다는 언체크(런타임) 예외를 선호한다.
Reference
인프런 김영한님의 자바강좌 + 나의 뇌