当变量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;
}
}
答案 0 :(得分:1)
由于你是从自己尝试回来的,所以finally块会被执行并且会被丢弃并且不会受到原始返回值的影响。
同样,只有返回的值没有效果,并且在那里执行的代码块将表现为与任何其他java块一样,您可以使用Object而不是原语并检查行为。
请注意finally不仅仅用于异常处理 - 它还允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。
答案 1 :(得分:1)
您将获得所有不可变对象和基元的相同答案。所有可变对象都将返回“已更改”的值,而所有不可变对象将保留其原始值,因此最终不会产生任何影响。