java:尝试最后阻止执行

2022-09-01 08:56:51

我对尝试块中存在时的try-final执行感到困惑。在我的理解中,最终块将始终执行,即在返回调用方法之前。同时考虑以下简单代码: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。这是否意味着最终块未执行?任何人都可以帮我吗?


答案 1

从块返回时,返回值存储在该方法的堆栈帧上。之后,执行最终的块。try

更改 finally 块中的值不会更改堆栈上已有的值。但是,如果您从 finally 块再次返回,则堆栈上的返回值将被覆盖,并且将返回新的。x

如果您打印 in final 块的值,您将知道它被执行,并且的值将被打印。xx

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;
}

建议阅读:


答案 2

执行最后的块。局部变量递增。但是,该局部变量的值已被复制为返回值。

来自 Java 语言规范 14.17:return 语句

带有表达式的 return 语句尝试将控制权转移给包含它的方法的调用方;表达式的值将成为方法调用的值。

...

前面的描述说“尝试转移控制权”而不仅仅是“转移控制权”,因为如果方法或构造函数中存在任何 try 语句 (§14.20),其 try 块或 catch 子句包含 return 语句,则在将控制权转移给方法或构造函数的调用程序之前,将按从最内到外的顺序执行这些 try 语句的任何最终子句。finally 子句的突然完成可能会中断由 return 语句发起的控制权转移


推荐