gpt4 book ai didi

java - Callable.call 声明抛出异常

转载 作者:行者123 更新时间:2023-11-30 10:19:26 28 4
gpt4 key购买 nike

当我声明我的 Callable.call() 方法抛出 Exception 时,编译器(Eclipse Neon 和 Oracle 的 javax 1.8.0_131 with -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 throw 规范的警告?

我明白 Callable.call()被声明为抛出异常,但我可以使我的实现抛出的异常少于接口(interface)允许的异常。

最佳答案

我相信会发生这种情况,因为当您声明将抛出 IOException 时,编译器实际上期望并检查方法中是否会出现该特定类型的异常。这可能是通过调用已知会抛出它的函数来实现的。编译器检查的异常称为已检查 异常。参见 javadoc了解更多信息。

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

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

关于java - Callable.call 声明抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48632703/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com