【发布时间】:2015-12-10 00:38:10
【问题描述】:
try {
throw new FileNotFoundException();
} catch (IOException e) {
e.printStackTrace();
}
catch (Exception e) {
e.printStackTrace();
}
谁能告诉我为什么第二个 catch 块不被编译器视为无法访问的代码?但在以下情况下:
try {
throw new FileNotFoundException();
} catch (Exception e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
第二个 catch 块被认为是不可达的?
毕竟,FileNotFoundException 属于 IOException,就像它属于 Exception 一样。
编辑请澄清: 编译器将根据方法的 throws 子句知道方法引发了异常。但它可能不一定知道异常的具体类型(在该异常类别下)。因此,如果方法抛出异常“A”,编译器将不知道实际异常是“A”还是“A”的子类型,因为这仅在运行时确定。然而,编译器会知道不会抛出“X”类型的异常,因此为 X 提供 catch 块是错误的。是这样吗?
【问题讨论】:
-
您可能想澄清您的问题是关于第一种还是第二种情况。我认为您的问题是关于第一种情况下的
catch (Exception e),以及为什么编译器不认为它无法访问。但看起来这里的大多数人都认为你在问你的第二个例子。是哪个? -
我想回答的人都足够清楚了。问题是关于这两种情况,即为什么第一种情况没有错误,而第二种情况有错误。
标签: java exception exception-handling checked-exceptions