Java抛出异常的方法覆盖

时间:2012-07-04 16:25:40

标签: java exception method-overriding

我正在尝试理解对象强制转换和方法覆盖。

我有一段代码:

    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类扩展,因此我们不能在子类中用“Exception”替换“SQLException”(我们正在改变重写方法的签名)。

但后来我这样做了:

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

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

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

我不确定为什么它会以这种方式表现。 当我们覆盖在方法签名中抛出异常的方法时,要遵循的规则是什么。

3 个答案:

答案 0 :(得分:4)

NullPointerExceptionRuntimeException都是未经检查的例外。

它们不需要列在throws子句中。

答案 1 :(得分:3)

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

来自the Java docs

  

“重写方法的throws子句可能没有指定这个   方法将导致抛出任何已检查的异常   通过其throws子句,不允许重写方法抛出。“

答案 2 :(得分:1)

是的,由于方法签名的更改,您发现第一个问题是正确的。使用NPE和RuntimeException进一步激活它是不正确的,因为不需要在签名上声明运行时异常。