小编典典

Java:尝试最后阻止执行

java

return;try块中存在时,我对try-
finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时:

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块?有人可以帮我吗?


阅读 214

收藏
2020-09-26

共1个答案

小编典典

try块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。

更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块再次返回,则堆栈上的返回值将被覆盖,并且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;
}

建议阅读:

2020-09-26