当我声明我的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()被声明为抛出异常,但是我可以使我的实现比接口允许的少。
答案 0 :(得分:1)
我相信这是因为当你声明将抛出IOException
时,编译器实际上期望并检查该方法中发生的特定类型的异常。这可以通过调用已知的函数来抛出它。编译器检查的异常称为已检查异常。有关详细信息,请参阅javadoc。
如果您只是声明一个常规Exception
,编译器就不会打扰,因为任何一段代码都可能产生异常。这些被称为未经检查的例外,并且RuntimeException
正常。
总结:当您指定要抛出的特定Exception
(不是RuntimeException
或其子类)时。编译器会验证它的可能性,并在不可能发生时发出警告。这意味着throws子句是不必要的。