Java中的方法覆盖抛出异常

4

我将尝试理解对象转换和方法重写。

这是一段代码:

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

    }

    class A extends ExceptionClass{

        void m() throws Exception{}
    }

这会出现错误信息:“在 ExceptionClass.m() 中,异常不兼容于 throws 子句中的 Exception 异常”。

如果按照以下方式写:

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

但是这里没有错误...!我以为会因为我上面提到的原因而产生相同的错误。

我不确定它为什么会表现出这种方式。 此外,当我们重写方法并在方法签名中抛出异常时,应该遵循什么规则。


请参见 https://dev59.com/VGkv5IYBdhLWcg3wjxhl。 - Raedwald
3个回答

4

NullPointerExceptionRuntimeException都是未受检查的异常。

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


1
重点是OP声明覆盖方法抛出更广泛的异常。 - jmj
1
还有,当我们覆盖方法时要遵循哪些规则? - jmj

3
你只能在重写的方法中减少或消除异常。语言不允许抛出更广泛的异常。
来自Java文档:

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


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接