关于java-7功能“精确重新抛出”和final Exception ex的问题很多,我无法为我的问题找到明确的答案。

“精确投掷”和final Exception有什么关系?

public static void main(String args[]) throws OpenException, CloseException {
    boolean flag = true;
    try {
        if (flag){
            throw new OpenException();
        }
        else {
            throw new CloseException();
        }
    }
    catch (final Exception e) {
        System.out.println(e.getMessage());
        throw e;
    }
}


如果我想使用“精确投掷”,是否必须使用final关键字?

catch (final Exception e) {
    System.out.println(e.getMessage());
    throw e;
}


如果不是强制性的,我可以将ex引用重新分配给新的例外吗?

catch (Exception e) {
    System.out.println(e.getMessage());
    e=new AnotherException();
    throw e;
}

最佳答案

不需要将异常参数(在示例中为e)声明为final即可获得精确的重新抛出语义。如果参数实际上是最终的,您还可以获得精确的重新抛出。

在第二个示例中,该参数不是有效的final,因此您不会获得精确的重新抛出语义。

(即使您分配给e的异常与try块中引发的原始异常兼容,这也适用。)

参考:JLS 11.2.2

关于java - “精确重新抛出”与最终异常之间的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44547388/

10-09 19:47