为什么 throw outerE;
会产生编译错误?我知道 throw e;
不应该因为 precise rethrow feature. 而产生编译器错误
它们是相同的 Exception
对象,但一个仅在 catch
block 内作用域,一个在 try-catch block 之外。
这些都不应该产生编译器错误吗?或者,至少,两者的行为方式相同?
static void preciseRethrowTest()
{
Exception outerE;
try
{
}
catch (Exception e)
{
outerE = e;
// Compilation error here. Unhandled exception type Exception
// throw outerE;
throw e; // No compiler error
}
}
我使用的是 Java 1.8.0_51。 (Java 7引入了精确重抛)
最佳答案
您的方法没有throws
声明。
编译器现在足够聪明,可以确定您的 try
block 不能抛出任何已检查的异常。因此,必须取消选中 catch
block 中捕获并绑定(bind)到 Exception
参数的任何异常。由于它们未经检查,您可以在闲暇时重新抛出它们(并且它们不需要 throws
声明)。
在这里,您正在尝试重新分配
outerE = e;
// Compilation error here. Unhandled exception type Exception
// throw outerE;
并通过不同的变量重新抛出异常。编译器不会深入了解 outerE
中的值是什么。它可能是您捕获的异常,也可能是其他原因。编译器会谨慎行事并阻止您这样做。
考虑如下代码
if (Math.random() < 0.5)
outerE = e;
else
outerE = new IOException("nope");
throw outerE;
编译器无法知道 outerE
中存储的 Exception
值是您捕获的未经检查的异常还是您从某处分配的其他可能已检查的异常否则。
关于java - 为什么这些重新抛出的异常中的任何一个都会产生编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31991611/