4

我试图了解对象转换和方法覆盖。

我有一段代码:

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

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

我不确定它为什么会这样。当我们重写方法时要遵循什么规则,这会在方法签名中抛出异常。

4

3 回答 3

4

NullPointerException并且RuntimeException都是未经检查的异常。

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

于 2012-07-04T16:28:46.010 回答
3

您只能减少或消除覆盖方法中引发的异常。该语言不允许抛出更广泛的异常。

来自Java 文档

“覆盖方法的 throws 子句可能未指定此方法将导致抛出任何已检查的异常,而覆盖方法的 throws 子句不允许抛出该异常。”

于 2012-07-04T16:29:24.197 回答
1

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

于 2012-07-04T16:29:12.710 回答