我正在阅读关于tutorialspoint的接口,并且遇到了以下内容:
“除了接口方法声明的实现方法或接口方法声明的子类之外,不应在实现方法上声明已检查的异常。”
有人可以向我解释这究竟是什么意思吗?
答案 0 :(得分:1)
这意味着如果接口I的方法声明为抛出一些已检查的异常E而不是某些客户端代码使用接口应该显式处理此已检查的异常(通过try-catch或进一步抛出)。如果你试图在你的C类中声明一些更多的已检查异常(E1),那么这将破坏应用程序的逻辑:我的客户端不知道除了E之外抛出的异常。
实际上,编译器不允许你这样做
答案 1 :(得分:1)
已检查的异常是必须在可能抛出它们的方法的类型签名中声明的异常。引用的是,实现接口的类不应该将任何已检查的异常添加到从接口实现的方法的签名中。
所以如果你有这样的界面:
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
因此,禁止添加此类例外。
但是,您可以编写一个实现,该实现抛出在接口上声明的已检查异常的子类。这将始终是一个安全的操作,因为子类可以用作它的超类的替代品。