Java中的异常和继承

cha*_*mba 11 java inheritance exception

假设我们有这个问题

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

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

}
Run Code Online (Sandbox Code Playgroud)

Child1扩展Father和覆盖,method1但鉴于实现Child1.method1现在抛出异常.这不会编译,因为重写方法不能抛出新的异常.

什么是最好的解决方案?

  • 传播所需的例外Father.对我而言,这是针对封装,继承和一般OOP(Father可能引发永远不会发生的异常).
  • 用一个RuntimeException代替?此解决方案不会传播ExceptionFather,但Oracle文档和其他来源声明,当"客户端代码无法执行任何操作"时,应使用该类异常.这不是那种情况,这个例外对于恢复blablabla很有用(为什么使用它是错误的RuntimeException?).
  • 其他..

Ale*_*exR 4

使用 RTE 并不是一个坏主意。这就是Spring框架的方法论,并且效果很好。如果您正在实施应用程序,可能会使用此解决方案。

但是,如果您正在实现公开 API 的库,恕我直言,您应该使用检查异常。在这种情况下,您应该创建自己的异常,例如BaseException。方法method()Father抛出它。定义ChildException extends BaseException并声明method1()子类以抛出它。

这不会破坏封装:基类抛出基本异常。它不知道具体的例外情况。子类抛出具体异常,但它扩展了基本异常,因此可以被客户端代码视为基本异常。

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