Java

자바 예외 재정의 규칙

caporatang 2024. 9. 1. 19:39
반응형

자바 예외 재정의 규칙

Runnable 인터페이스의 run() 메서드를 구현할 때 InterruptedException 체크 예외를 thrwos 할 수 없는 이유는 자바의 규칙 때문이다.

public interface Runnable {
    void run();
}

자바에서 메서드를 재정의 할 때, 재정의 메서드가 지켜야할 예외 관련 규칙은

  • 체크 예외
    • 부모 메서드가 체크 예외를 던지지 않는 경우, 재정의된 자식 메서드도 체크 예외를 던질 수 없다.
    • 자식 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만 던질 수 있다.
  • 언체크(런타임) 예외
    • 예외 처리를 강제하지 않으므로 상관없이 throw 할 수 있다.

Runnable 인터페이스의 run() 메서드는 아무런 체크 예외를 throw 하지 않는다. 따라서 Runnable 인터페이스의 run() 메서드를 재정의 하는 곳에서는 체크 예외를 throw 할 수 없다.

자바에서 이런 제약을 두는 이유?

부모 클래스의 메서드를 호출하는 클라이언트 코드는 부모 메서드가 던지는 특정 예외만을 처리하도록 작성된다. 자식 클래스가 더 넓은 범위의 예외를 던지면 해당 코드는 모든 예외를 제대로 처리하지 못할 수 있다.
예외 처리의 일관성을 지키고, 예상하지 못한 런타임 오류를 막기 위함이다.

class Parent {
    void method() throws InterruptedException {
        /* do something...*/
    }

    class Child extends Parent {
        @Override
        void method() throws Exception {
        // 부모 메서드가 InterruptedException을 thorws 하는데 자식 메서드에서 상위인 Exception을 던지면 컴파일 에러가 난다
            /* do something...*/
        }
    }

    public class Test {
        public static void main(String[] args) {
            try {
                Parent p = new Child();
                p.method();
            } catch (InterruptedException e) {
                // Parent를 참조해서 객체를 만들었으니, 자바 컴파일러 입장에서는 InterruptedException 을 잡게된다.
                // InterruptedException 처리
            }
        }
    }
}

정리 하자면, 자바 컴파일러는 Parent p의 method() 를 호출한 것으로 인지한다. method()는 InterruptedException을 반환하는데, 재정의한 자식이 다른 예외를 반환한다면 클라이언트는 해당 예외를 잡을 수 없다.

체크 예외 재정의 규칙

자식 클래스에 재정의된 메서드는 부모 메서드가 던질 수 있는 체크 예외의 하위 타입만을 throw할 수 있고, 원래 메서드가 체크 예외를 throw 하지 않는 경우, 재정의된 메서드도 체크 예외를 던질 수 없다

반응형

'Java' 카테고리의 다른 글

[Thread] Atomic, volatile, synchronized 성능 비교  (0) 2024.09.03
[Thread] synchronized  (0) 2024.09.02
Java - Reactor_pattern  (0) 2024.05.07
Java NIO - Selector  (0) 2024.05.05
Java - Direct, Heap Buffer SelectableChannel  (0) 2024.04.25