【发布时间】:2015-11-16 03:42:11
【问题描述】:
我在 tutorialspoint 上阅读了有关 Interfaces 的内容,并遇到了以下内容:
“除了接口方法声明的方法或接口方法声明的子类之外,不应在实现方法上声明已检查的异常。”
谁能给我解释一下这到底是什么意思?
【问题讨论】:
标签: java exception interface checked-exceptions
我在 tutorialspoint 上阅读了有关 Interfaces 的内容,并遇到了以下内容:
“除了接口方法声明的方法或接口方法声明的子类之外,不应在实现方法上声明已检查的异常。”
谁能给我解释一下这到底是什么意思?
【问题讨论】:
标签: java exception interface checked-exceptions
已检查异常是必须在可能抛出它们的方法的类型签名中声明的异常。这句话的意思是,实现接口的类不应将任何已检查异常添加到其从接口实现的方法的签名中。
所以如果你有这样的界面:
interface NoExceptions{
void safeMethod();
}
禁止你声明这样的类:
class UnsafeClass{
@Override
void safeMethod() throws IOException{}
}
因为它正在修改类型签名。相反,应该在方法内部处理这些异常。
这是因为检查异常的目的是确保调用代码能够处理可能发生的问题。尝试在子类中添加异常会消除这种安全性:
UnsafeClass uc = new UnsafeClass();
uc.safeMethod(); //Not allowed, because the exception is not handled
NoExceptions ne = uc;
ne.safeMethod(); //Becomes allowed, because the interface does not declare an exception
因此,您被禁止添加这样的异常。
但是,您可以编写一个实现,该实现抛出在接口上声明的已检查异常的子类。这将始终是一个安全的操作,因为子类可以用作它的超类的替代品。
【讨论】:
这意味着如果我声明的接口方法抛出一些检查异常 E 而不是一些客户端代码使用接口应该显式处理这个检查异常(通过 try-catch 或进一步抛出)。如果您尝试在实现 I 的 C 类中声明更多已检查异常 (E1),这将破坏应用程序的逻辑:I 的客户不知道除了 E 之外抛出的异常。
实际上,编译器不允许你这样做
【讨论】: