总是在接口方法上声明“抛出异常”?

时间:2017-07-26 19:02:58

标签: java oop exception-handling

如果你有一个接口但你不知道它的方法将如何实现(即它是一个其他用户将扩展的库),你怎么知道该方法的实现是否会异常?你应该在每个接口方法上声明“抛出异常”,因为你不知道实现吗?

例如,我正在制作一个http客户端。该库有一个Request接口,表示http请求字符串:

public interface Request
{
    String asString(); // no "throws" here  
}

public final class AssembledRequest implements Request
{
    // ...
    public AssembledRequest(Method method, Url url, Headers headers, Body body) {
        // ...
    }
    public String asString() {
        // ...
    }
}

它还有一个Response类,它使用这个Request接口。 我自己的实现(AssembledRequest)不会抛出异常,它只是汇集了一堆字符串,而且大多数实现都不会抛出任何东西。

但是,如果用户想要以Request从文件中读取的方式实现asString,该怎么办?然后我们处理IOExcepton,用户很难处理这些异常。没有声明throws...,所以你必须在方法中处理它,这是不可能的,因为你想捕获它并重新抛出,所以它会冒泡到应用程序的顶部然后被处理

如果Request界面在throws Exception上宣布了asString,则会更容易。这使我得出结论,对于库,所有接口的方法都应该有throws Exception。我是对的吗?

1 个答案:

答案 0 :(得分:-1)

接口是实现和规范之间的API。如果您正在创作API,那么您就会知道您的API是否/何时会允许某些内容被抛出。

那就是说,我会采取以下两种行动之一:

  • 实现单独的接口,可以接受抛出这些异常,或
  • 将检查过的异常换成某种RuntimeException,然后让它冒泡。

例外是有特殊原因的。除非您的代码明确指望它,否则不要明确允许它。