2012-07-04 5 views
4

Object Casting 및 메서드 재정의를 이해하려고합니다.Java throw 예외에서 메서드 재정의

이 오류 제공
public class ExceptionClass{ 
     void m() throws SQLException{} 

    } 

    class A extends ExceptionClass{ 

     void m() throws Exception{} 
    } 

"예외 예외() ExceptionClass.m에 throws 절과 호환되지 않습니다"

나는 코드의 조각이있다.

같은

은 나뿐만 작성하는 경우 :

public class ExceptionClass{ 
     void m() throws SQLException{} 
    } 

    class A extends ExceptionClass{ 

     void m() throws RuntimeException{} 
    } 

이 나던 오류를 포기하고 방법도 적절하게 무시됩니다. 일부 분석 후 나는 SQLException이 Exception 클래스에서 확장 되었기 때문에 하위 클래스에서 "SQLException"을 "Exception"으로 대체 할 수 없다 (오버라이드 된 메서드의 서명을 변경 함) 것으로 생각했습니다.

그러나 나는이 한 :

public class ExceptionClass{ 
     void m() throws NullPointerException{} 
    } 

    class A extends ExceptionClass{ 
     void m() throws RuntimeException{} 
    } 

을하지만 오류는 여기 없다 ..! 위에서 언급 한 이유로 같은 오류가 발생한다고 생각했습니다.

왜 이런 식으로 행동하는지 잘 모르겠습니다. 또한 메서드 서명을 예외를 throw하는 메서드를 재정의 할 때 따라야 할 규칙은 무엇입니까?

답변

4

NullPointerExceptionRuntimeException은 모두 이며 확인되지 않은 예외입니다.

throws 절에 나열 할 필요가 없습니다.

+0

요점은 OP가 더 넓은 예외를 throw하는 방법을 선언하고 있다는 것입니다. –

+0

@ JigarJoshi : 그는 이미 그것을 이해 한 것 같습니다. – SLaks

+1

_ 메소드를 재정의 할 때 따라야 할 규칙은 무엇입니까? –

1

예, 방법 서명이 변경되어 첫 번째 문제가 발생했다는 것이 맞습니다. 런타임 예외를 서명에 선언 할 필요가 없기 때문에 NPE 및 RuntimeException을 사용하여 더 이상 고려하지 않습니다.

3

오버라이드 된 메소드에서 발생하는 예외 만 축소하거나 제거 할 수 있습니다. 광범위한 예외를 throw하는 것은 해당 언어에서 허용되지 않습니다. the Java docs에서

:

는 "그 throws 절에 의해,이 방법은 어떤 것이 오버라이드 (override)되는 메소드가 허용되지 않는 예외를 확인 던지는 발생하도록 지정하지 않을 수 있습니다 최우선 메소드의 throws 절 던지다."