2012-07-04 153 views
4

我想了解对象抛出和方法重写。在Java中抛出异常的方法抛出异常

我有一段代码:

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{} 
    } 

但这里没有错误..!我认为它应该给出同样的错误,因为我上面提到的原因。

我不知道为什么会以这种方式表现。 当我们重写方法时会遵循什么规则,这会在方法签名中引发异常。

回答

4

NullPointerExceptionRuntimeException都是未检查例外。

他们不需要throws子句中被列出。

+0

重点是OP声明重写方法抛出更广泛的异常 –

+0

@JigarJoshi:看起来他已经明白了。 – SLaks

+1

_当我们覆盖methods_时,还有什么规则要遵循_ –

1

是的,你是对的,第一个问题是由于方法签名的改变而发生的。使用NPE和RuntimeException进一步加大错误是不正确的,因为运行时异常不需要在签名中声明。

3

您只能减少或消除重写的方法中引发的异常。语言不允许抛出更广泛的例外。

the Java docs

“的抛出压倒一切的方法的子句可以不指定该 方法将导致抛出任何检查其中 重写方法是不允许的异常,通过其throws子句,至扔。”