java - 为什么这些重新抛出的异常中的任何一个都会产生编译器错误?

标签 java exception exception-handling throws

为什么 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/

相关文章:

Swift 3 - CollectionView 选择不可见

python - 如果传递给 **kwargs 的参数数量错误,会引发什么异常?

java - ArrayList 有两个元素,是否可以找到 int 元素的平均值?

java - JSP:如何使用 onClick 或 onSubmit 事件在列表中添加值?

java - 循环不执行内部if语句

java - UnsatisfiedLinkError:无法加载库

c# - 查找未处理的异常 - .NET

c# - 异常在 try/catch 上下文中丢失了部分堆栈跟踪

php - 这种处理PHP错误的方法是否有任何 "gotchas"?

c# 控制台应用程序 - 防止默认异常对话框