【发布时间】:2016-02-25 00:25:05
【问题描述】:
给定以下代码:
interface Provider
{
String getStuff();
}
class CustomProvider implements Provider
{
public String getStuff() throws RuntimeException
{
// possibly throwing an exception
return "some stuff";
}
}
class Main
{
public static void main(String[] args)
{
Main main = new Main();
main.test(new CustomProvider());
}
public void test(Provider provider)
{
provider.getStuff(); // we don't know that this can throw an exception!
}
}
在这种特殊情况下,我们知道这一点,但在另一种情况下可能不知道。
我们如何防止接口的实现抛出未经检查的异常但客户端方法不知道接口的具体实现的情况?
似乎有时对于未经检查的异常,您实际上永远无法知道调用方法是否会引发异常。
解决方案可以是更改接口中方法的签名:
interface Provider
{
String getStuff() throws Exception;
}
这将确保该方法的客户端将被告知在所有实现中都可以抛出异常。这样做的问题是,可能没有一个接口的实现实际上会抛出异常。还在接口的每个方法中放置“抛出异常”看起来有点奇怪。
【问题讨论】:
-
好问题,但基于您陈述的确切原因,您的观点相当公平。
-
运行时异常就是这样:它们没有被检查。这就是为什么有文档的原因——这是传达 RTE 可能性的唯一方式。不仅可以抛出实际的
RTE,还可以抛出它的子类。 -
我觉得把
throws AnyUncheckedException放在任何地方有点奇怪。 -
@DaveNewton 让我问你一个问题。如果一个方法接收到一个实现接口的对象,你是否认为“非常短视、非常危险和不负责任”? (记住:程序是接口,而不是实现)。您是否真的认为在不知道具体实现是什么的情况下使用接口“零意义”(毕竟,这就是接口的用途)。现在,如果您只知道您的参数实现了该接口,您将在哪里阅读文档?在界面?在所有的实现中?
-
@DaveNewton 为什么在使用接口时会关心实现?这不就是接口的用途,从实现中抽象出来吗?如果在一种情况下您需要了解有关实现的详细信息,那么您应该使用具体类而不是接口。但是在我在这里描述的情况下,假设您收到一个实现接口的对象作为参数(为了不依赖于特定的实现,例如抽象)。您不知道在参数中收到的具体类是什么。你是做什么的?
标签: java exception interface implementation