java - Callable.call 声明抛出异常

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

最佳答案

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

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

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

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

相关文章:

java - 添加表关系时找不到表

java - 使用带有数组的compareTo方法按姓名和考试成绩对学生进行排序

php - symfony2 并抛出异常错误

java - Java 处理程序对象如何捕获所有已捕获和未捕获的异常?

java - 如何以 AM/PM 格式显示时间

来自 BaseClassLoader 的 java.lang.ClassNotFoundException : org. apache.commons.lang.StringUtils

java - 如何避免在 Java 中使用多个 if-else 语句进行验证

python - 类型错误 : _log() got an unexpected keyword argument 'stacklevel'

java - 在java程序中创建暂停或等待效果

c# - ThrowUnobservedTaskExceptions 不工作