我已经创建了一个如下所示的类,并且想知道为什么我无法简单地捕获并抛出异常:
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();
}
}
}
这是怎么回事?
答案 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
的错误。