假设我们有这个问题
public class Father{ public void method1(){...} } public class Child1 extends Father{ public void method1() throws Exception{ super.method1(); ... } }
Child1扩展Father和覆盖,method1但鉴于实现Child1.method1现在会引发异常。由于覆盖方法不能引发新的异常,因此不会编译。
Child1
Father
method1
Child1.method1
最好的解决方案是什么?
RuntimeException
Exception
使用RTE并不是一个坏主意。这是Spring框架的方法,效果很好。如果您要实现应用程序,则可以使用此解决方案。
但是,如果您正在实现公开API IMHO的库,则应使用已检查的异常。在这种情况下,您应该创建自己的异常,例如BaseException。法method()的Father将它扔。子类的定义ChildException extends BaseException和声明method1()将其抛出。
BaseException
method()
ChildException extends BaseException
method1()
这不会破坏封装:基类抛出基异常。它对具体异常一无所知。子类抛出具体的异常,但是该异常扩展了基本异常,因此可以被客户端代码视为基本异常。
举个例子,我可以给你IOException,FileNotFoundException然后扩展它。您可以在输入流捕获并抛出IOException时使用输入流捕获。但是客户不知道这一点。抓住了。FileInputStream``FileNotFoundException``IOException
IOException
FileNotFoundException
FileInputStream``FileNotFoundException``IOException