2014-05-21 3 views
0

demo() 메서드를 사용하여 throw 절을 사용할 때 오류가 발생합니다. 상속에서 throw 사용에 대한 제한 사항을 알고 싶습니다.java에서 오버라이드 메소드로 throws 절을 사용하는 중에 오류가 발생 했습니까?

오류는 다음과 같습니다. 예외 ClassNotFoundExceptionTest.demo()의 throws 절과 호환되지 않습니다. 당신이 방법을 재정의 어떤 그것을 무시 것 방법은 선언하지 않은 것으로 확인 된 예외를 던질 것을 선언 할 수 없습니다 -

Class Test 
{ 
    public void demo() throws NumberFormatException, ArrayIndexOutOfBoundsException//error 
    { 
     //something here 
    } 
    public void demo(String s) 
    { 
     //something here 
    } 
}//end of Test class 

public class MyTest extends Test 
{ 
    public void demo() throws IndexOutOfBoundsException,ClassNotFoundException 
    { 
     //something here 
    } 
    public static void main(String[] args) 
    { 

    } 
} 
+2

오류 메시지는 무엇입니까? – Thilo

+1

demo() 메서드는 자식 및 부모 클래스에 다른 예외를 던져서는 안됩니다. – TheLostMind

+0

예외 ClassNotFoundException은 Test.demo()의 throws 절과 호환되지 않습니다. – varun

답변

3

ClassNotFoundException예외을 확인합니다. section 8.4.8.3 of the JLS에서

:

더 던져 오버라이드 (override) 또는 숨겨진 방법보다 예외를 확인 선언 할 수 없습니다, 인터페이스에 정의 된 추상 메소드를 구현하는 방법을 포함, 오버라이드 (override) 또는 다른 방법을 숨기는 방법.

예를 들어, 고려 :

Test.demo() 그것이 던질 것을 선언하지 않기 때문에 ClassNotFoundException가 발생합니다 것을 나타 내기 위해 그 코드에 아무것도, 없다
Test t = new MyTest(); 
t.demo(); 

. 그러나 확인 된 예외의 전체적인 점은 호출자가 을 강제로으로 처리해야한다는 것을 의미합니다 (예외를 던지거나 이라고 함). 메소드를 오버라이드 (override) 해, 원래의 메소드 선언으로 커버되고 있지 않는 새로운 체크 예외를 throw하는 것을 선언하는 기능은, 그 말도 안되는 것입니다.

0

자식 클래스의 메서드를 재정의하는 경우 throws 절이 재정의 된 메서드와 호환되어야합니다. 귀하의 경우에는 필수 아닌 당신의 Test.demo() 방법 throws NumberFormatException, ArrayIndexOutOfBoundsException은 당신이하는 IndexOutOfBoundsException에서 IndexOutOfBoundsException,ClassNotFoundException을 던지고있다 당신의 MyTest.demo에서 RuntimeExceptions

() 메소드되어 RuntimeException을하고 그 다시 던질 필수가 아니기 때문에 throws 절 . ClasssNotFoundException은 검사 된 예외이며 부모 클래스 demo() 메서드에 일치 할 수있는 것이 없습니다. 따라서 오류가 발생합니다.

두 가지 옵션 수정하기 :

  1. 은 Test.demo()에 ClassNotFoundException가 추가
  2. 이 MyTest.demo()에서 제거

는 희망이

을하는 데 도움이
1

상속인의 핵심 원칙 중 하나를 위반하기 때문에 컴파일러 오류가 발생합니다. 자바에서 (그리고 적절한 OOP에서). 이 원칙은 입니다. 오버라이드 멤버는 슈퍼 클래스에 선언 된대로 오버라이드 된 멤버보다 호출자에게 더 많은 제한을 부과 할 수 없습니다. 액세스 유형이나 선언 된 예외 유형에 대해 논의하더라도.

귀하의 경우 ClassNotFoundException은 수퍼 클래스 또는 그 조상 중 하나에서 선언되지 않습니다.

관련 문제