java7 中的精确重新抛出异常

Precise rethrow exception in java7

assylias 很好地解释了 final rethrow。 我在 method3.

中添加了 final
public void method4() throws IOException {
    try {
        throw new IOException("1");
    } catch (final Exception e) {
        e = new IOException("2"); //does not compile
        throw e; //does not compile
    }
}

我将我的编译器设置为 1.7。 method4 有两个编译错误:

final exception can neither be reassigned nor throw precise exception. 

那么,explicitfinal异常只是用来防止修改的?

Exception 的 catch 块是隐含的 final 这并不意味着你不能重新分配它。如果您专门将其设为 final,则编译器将不允许您修改该引用。要使 throw 编译异常实例必须 final 有效 final 已在链接答案中涵盖。

public void method4() throws IOException {
    try {
        throw new IOException("1");
    } catch (final Exception e) {
        e = new IOException("2");// You can not modify final reference
        throw e;
    }
}

so explicit final exception is only used to prevent modify?

是的,在例外情况下,final 修饰符是多余的。始终建议 throwlog 例外。根据我的说法,任何异常的修改都是反模式。一般来说,即使在自定义异常的情况下,我们也不应该修改抛出的异常,除非并且直到您有非常充分的理由这样做。