>Java >java지도 시간 >하위 클래스 메서드가 상위 클래스 메서드보다 더 광범위한 검사 예외를 던질 수 있나요?

하위 클래스 메서드가 상위 클래스 메서드보다 더 광범위한 검사 예외를 던질 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-29 09:57:11956검색

Can a Subclass Method Throw Broader Checked Exceptions Than Its Superclass Method?

재정의 메서드 예외 선언 이해

Java에서 하위 클래스의 메서드를 재정의할 때 재정의 메서드는 throw된 항목과 관련된 특정 규칙을 준수해야 합니다. 예외. 특히 재정의 메서드는 재정의된 메서드에서 선언한 것보다 새롭거나 더 광범위한 확인된 예외를 발생시킬 수 없습니다.

예를 들어 기본 클래스 메서드가 FileNotFoundException을 발생시키도록 선언하는 경우 하위 클래스의 재정의 메서드는 예외를 발생시킬 수 없습니다. SQLException, 예외 또는 하위 클래스가 아닌 기타 비런타임 예외 FileNotFoundException.

제한 이유

이 제한은 다형성 원칙과 Liskov 대체 원칙(LSP)에서 비롯됩니다. LSP에서는 프로그램 동작이 올바르게 유지되도록 모든 상황에서 하위 클래스가 기본 클래스를 대체할 수 있어야 한다고 명시합니다.

재정의 메서드가 더 광범위한 예외를 발생시킬 수 있다면 LSP를 위반하는 것입니다. 예를 들어 기본 클래스 메서드 foo()가 IOException을 발생시키도록 선언하고 재정의 메서드가 SQLException을 발생시키도록 선언하는 경우 컴파일러는 더 이상 호출자가 IOException을 처리하도록 강제하지 않습니다.

그러나 하위 클래스가 기본 클래스로 처리되는 경우 호출자는 재정의 메서드에서 발생하는 더 광범위한 예외를 처리할 것으로 예상하지 않거나 처리할 준비가 되어 있지 않을 수 있습니다. 이로 인해 런타임 예외가 발생하고 예측할 수 없는 동작이 발생합니다.

다음 코드를 고려하세요.

class A {
   public void foo() throws IOException {..}
}

class B extends A {
   @Override
   public void foo() throws SocketException {..} // allowed

   @Override
   public void foo() throws SQLException {..} // NOT allowed
}

이 예에서 재정의 메서드는 클래스 B에서는 IOException의 하위 클래스이기 때문에 SocketException이 발생할 수 있습니다. 그러나 SQLException은 IOException의 하위 클래스가 아니기 때문에 SQLException을 발생시킬 수 없습니다.

검사되지 않은 예외

검사되지 않은 예외에는 이 제한이 적용되지 않습니다. 재정의된 메서드의 throw 절에 선언되었는지 여부에 관계없이 재정의된 메서드에 의해 발생할 수 있습니다.

위 내용은 하위 클래스 메서드가 상위 클래스 메서드보다 더 광범위한 검사 예외를 던질 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.