无法抛出异常

时间:2020-07-20 23:21:18

标签: java exception

我已经创建了一个如下所示的类,并且想知道为什么我无法简单地捕获并抛出异常:

public class TestClass implements Runnable {
    @Override
    public void run() {
        try{
            FileInputStream inStream = new FileInputStream("");
        }catch(Exception e){
            throw e;
        }
    }
}

Eclipse显示编译错误:“未处理的异常类型FileNotFoundException” 并提出以下修复程序,出于某种原因,该修复程序可以正常运行:

@Override
public void run() {
    try{
        FileInputStream istream = new FileInputStream("");
    }catch(Exception e){
        try {
            throw e;
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
}

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

FileInputStream的构造函数声明引发已检查的异常。根据所谓的catch or specify requirement,这意味着引发此类型异常的方法必须捕获该异常(不包括重新抛出该异常),或在其接口中声明它。因为您的run方法没有声明它(并且您不能因为它覆盖了Runnable#run()而不能声明),所以会出现错误。

如果捕获异常并用打印语句将其吞下,则说明您符合“捕获”要求,并且错误消失了。如果您抛出的异常扩展了RuntimeException,则这是未经检查的异常,并且catch或指定要求不适用。

有趣的是,Eclipse编译器进行的流分析有点过于激进,这导致令人困惑的错误消息,并且可能是不完整的错误消息

未处理的异常类型 FileNotFoundException

这种类型的特殊性将不完整的示例是,如果您的try块中包含以下代码:

Class.forName("foo");
FileInputStream inStream = new FileInputStream("");

然后,即使FileInputStream也会导致其他类型(forName)的未处理检查异常,您仍然会收到关于ClassNotFoundException的错误。

相关问题