如果finally块修改了catch块返回的值会发生什么?

时间:2017-03-17 08:09:12

标签: java try-catch

当变量value是原语时,变量的finally块修改无效。但是,当value是引用时,变量的finally块修改生效。你能帮忙解释为什么会这样吗?

StringBuilder value = new StringBuilder("abc");

StringBuilder get() {

    try {
        throw new IndexOutOfBoundsException();
    } catch (IndexOutOfBoundsException e) {
        return value;
    } finally {
        value = value.append("def");
    }
}
 int value = 10;

int get() {

    try {
        throw new IndexOutOfBoundsException();
    } catch (IndexOutOfBoundsException e) {
        return value;
    } finally {
        value = value + 10;
    }
}

2 个答案:

答案 0 :(得分:1)

由于你是从自己尝试回来的,所以finally块会被执行并且会被丢弃并且不会受到原始返回值的影响。

同样,只有返回的值没有效果,并且在那里执行的代码块将表现为与任何其他java块一样,您可以使用Object而不是原语并检查行为。

请注意finally不仅仅用于异常处理 - 它还允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

答案 1 :(得分:1)

您将获得所有不可变对象和基元的相同答案。所有可变对象都将返回“已更改”的值,而所有不可变对象将保留其原始值,因此最终不会产生任何影响。