如果你有一个接口但你不知道它的方法将如何实现(即它是一个其他用户将扩展的库),你怎么知道该方法的实现是否会异常?你应该在每个接口方法上声明“抛出异常”,因为你不知道实现吗?
例如,我正在制作一个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
。我是对的吗?
答案 0 :(得分:-1)
接口是实现和规范之间的API。如果您正在创作API,那么您就会知道您的API是否/何时会允许某些内容被抛出。
那就是说,我会采取以下两种行动之一:
RuntimeException
,然后让它冒泡。例外是有特殊原因的。除非您的代码明确指望它,否则不要明确允许它。