0

我正在阅读关于教程点的接口,并遇到以下内容:

“检查的异常不应在接口方法声明的实现方法或接口方法声明的子类之外的实现方法上声明。”

谁能向我解释这到底是什么意思?

4

2 回答 2

1

这意味着如果我声明的接口方法抛出一些检查异常 E 而不是一些客户端代码使用接口应该显式处理这个检查异常(通过 try-catch 或进一步抛出)。而且,如果您尝试在实现 I 的 C 类中声明更多已检查异常(E1),这将破坏应用程序的逻辑:I 的客户不知道除了 E 之外抛出的异常。

实际上,编译器不允许你这样做

于 2015-11-16T03:51:14.193 回答
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

因此,您被禁止添加这样的异常。

但是,您可以编写一个实现,该实现抛出接口上声明的已检查异常的子类。这将始终是一个安全的操作,因为子类可以用作它的超类的替代品。

于 2015-11-16T03:55:45.820 回答