小编典典

Java中的异常和继承

java

假设我们有这个问题

public class Father{
    public void method1(){...}
}

public class Child1 extends Father{
    public void method1() throws Exception{
    super.method1();
    ... 
    }

}

Child1扩展Father和覆盖,method1但鉴于实现Child1.method1现在会引发异常。由于覆盖方法不能引发新的异常,因此不会编译。

最好的解决方案是什么?

  • 将所需的异常传播到Father。对我来说,这是反对封装,继承和一般OOP的(Father可能会引发永远不会发生的异常)。
  • 使用RuntimeException呢?此解决方案不会将传播ExceptionFather,但是Oracle文档和其他来源指出,当“客户端代码无法执行任何操作”时,应使用异常类。并非这种情况,此异常将对恢复blablabla有用(为什么使用错误的用法RuntimeException呢?)。
  • 其他..

阅读 223

收藏
2020-11-16

共1个答案

小编典典

使用RTE并不是一个坏主意。这是Spring框架的方法,效果很好。如果您要实现应用程序,则可以使用此解决方案。

但是,如果您正在实现公开API
IMHO的库,则应使用已检查的异常。在这种情况下,您应该创建自己的异常,例如BaseException。法method()Father将它扔。子类的定义ChildException extends BaseException和声明method1()将其抛出。

这不会破坏封装:基类抛出基异常。它对具体异常一无所知。子类抛出具体的异常,但是该异常扩展了基本异常,因此可以被客户端代码视为基本异常。

举个例子,我可以给你IOExceptionFileNotFoundException然后扩展它。您可以在输入流捕获并抛出IOException时使用输入流捕获。但是客户不知道这一点。抓住了。FileInputStream``FileNotFoundException``IOException

2020-11-16