【发布时间】:2014-09-18 20:14:21
【问题描述】:
我偶然注意到这个throw 语句(从一些更复杂的代码中提取)可以编译:
void foo() {
try {
} catch (Throwable t) {
throw t;
}
}
有一个短暂而快乐的时刻,我以为受检异常终于决定死了,但它仍然对此感到高兴:
void foo() {
try {
} catch (Throwable t) {
Throwable t1 = t;
throw t1;
}
}
try 块不必为空;只要该代码不引发检查异常,它似乎就可以有代码。这似乎是合理的,但我的问题是,语言规范中的什么规则描述了这种行为?据我所知,§14.18 The throw Statement 明确禁止它,因为t 表达式的类型是一个检查异常,它没有被捕获或声明被抛出。 (?)
【问题讨论】:
-
+1。这实际上引发了关于 multicatch
catch (final RuntimeException | Error e) { throw e; }的相同问题,因为根据 §14.20,e的类型是Throwable。
标签: java exception language-lawyer throw checked-exceptions