Callable.call声明抛出异常

时间:2018-02-05 22:43:02

标签: java exception

当我声明我的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()被声明为抛出异常,但是我可以使我的实现比接口允许的少。

1 个答案:

答案 0 :(得分:1)

我相信这是因为当你声明将抛出IOException时,编译器实际上期望并检查该方法中发生的特定类型的异常。这可以通过调用已知的函数来抛出它。编译器检查的异常称为已检查异常。有关详细信息,请参阅javadoc

如果您只是声明一个常规Exception,编译器就不会打扰,因为任何一段代码都可能产生异常。这些被称为未经检查的例外,并且RuntimeException正常。

总结:当您指定要抛出的特定Exception(不是RuntimeException或其子类)时。编译器会验证它的可能性,并在不可能发生时发出警告。这意味着throws子句是​​不必要的。