当return;try块中存在时,我对try- finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时:
return;
public class TryCatchTest { public static void main(String[] args){ System.out.println(test()); } static int test(){ int x = 1; try{ return x; } finally{ x = x + 1; } } }
实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗?
从try块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。
try
更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块再次返回,则堆栈上的返回值将被覆盖,并且x将返回新值。
x
如果打印xinfinally块中的值,您将知道它已执行,并且x将打印出值。
static int test(){ int x = 1; try{ return x; } finally{ x = x + 1; System.out.println(x); // Prints new value of x } }
注意: 如果返回参考值,则参考值存储在堆栈中。在这种情况下,您可以使用该引用来更改对象的值。
StringBuilder builder = new StringBuilder(""); try { builder.append("Rohit "); return builder; } finally { // Here you are changing the object pointed to by the reference builder.append("Jain"); // Return value will be `Rohit Jain` // However this will not nullify the return value. // The value returned will still be `Rohit Jain` builder = null; }
建议阅读: