如Fowler的Refactoring book中所述,不要理解更改接口的异常处理

时间:2014-04-07 16:37:35

标签: java refactoring

我正在阅读关于重构的福勒书。在更改接口部分的第2章中。我不明白这段经文:

  

在更改接口时,有一个特定区域存在问题   Java:在throws子句中添加一个异常。这不是改变   在签名中,所以你不能使用委托来掩盖它。编译器   但是,不会让它编译。处理这个很难   问题。您可以为方法选择一个新名称,让旧方法   调用它,并将checked转换为未经检查的异常。您可以   也抛出一个未经检查的异常,虽然你失去了检查   能力。执行此操作时,您可以提醒您的呼叫者   异常将在未来日期成为检查异常。然后他们   有时间将处理程序放入代码中。出于这个原因我   更喜欢为整个包定义超类异常(例如   java.sql的SQLException)并确保公共方法只声明   他们的throws子句中的这个异常。那样我就可以定义子类了   如果我愿意,可以例外,但这不会影响只知道的呼叫者   关于一般情况。

有人可以用一个例子解释一下吗?万分感谢!

1 个答案:

答案 0 :(得分:2)

假设您目前有:

public interface Foo {
    void bar();
}

您无法在以后将其演变为:

public interface Foo {
    void bar() throws SomeException;
}

(其中SomeException是一个已检查的异常),因为之前调用bar()的代码不会捕获SomeException ...它将在更改后无法编译。建议的解决方法是引入一种新方法:

public interface Foo {
    void bar();
    var barWithException() throws SomeException;
}

...虽然Foo的任何实施都会失效,因为他们不会声明barWithException()

建议的另一个替代方法是使SomeException成为未经检查的异常,并警告用户以后可能会对其进行检查。