当我声明我的Callable.call()
时抛出方法 Exception
,编译器(Eclipse Neon 和 Oracle 的 javax 1.8.0_131 以及 -Xlint:all
)保持沉默,但是当我声明它抛出 IOException
时,编译器保持沉默。 ,编译器认为这永远不会发生。
public class CallableException implements java.util.concurrent.Callable<Void> {
@Override
public Void call() throws Exception {
// no warning -- why not?
return null;
}
}
public class CallableIoException implements java.util.concurrent.Callable<Void> {
@Override
public Void call() throws java.io.IOException {
// warning: declared exception IOException is not actually thrown
return null;
}
}
为什么我没有收到 throws Exception
的警告抛出规范?
据我了解 Callable.call()被声明为抛出异常,但我可以使我的实现抛出的异常少于接口(interface)允许的异常。
最佳答案
我相信会发生这种情况,因为当您声明将抛出 IOException
时,编译器实际上期望并检查该方法中是否发生该特定类型的异常。这可以通过调用已知的函数来抛出它。编译器检查的异常称为检查异常。请参阅javadoc了解更多信息。
如果您只是声明一个常规的Exception
,编译器不会打扰,因为任何代码段都可能产生异常。这些被称为未检查异常,并且属于RuntimeException
类型。
总之:当您指定要抛出的特定Exception
(不是RuntimeException
或其子类)时。编译器会验证其可能性,如果无法发生则发出警告。这意味着 throws 子句是不必要的。
关于java - Callable.call 声明抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48632703/