如何尝试...最终在内部工作

2022-09-04 21:23:03

目前,我正在使用try进行代码优化。最后阻止以尊重我的对象。

但是我感到困惑的是,当我在最终块中创建对对象的空引用时,如何管理返回对象。??

在 try 块中返回对象时,它会在编译期间创建预编译语句吗?或者在返回语句时在堆中创建新的引用?或者只是返回对象的当前引用?

以下是我的研究代码。

public class testingFinally{
    public static String getMessage(){
        String str = "";
        try{
            str = "Hello world";
            System.out.println("Inside Try Block");
            System.out.println("Hash code of str : "+str.hashCode());
            return str;
        }
        finally {
            System.out.println("in finally block before");
            str = null;
            System.out.println("in finally block after");
        }
    }

    public static void main(String a[]){
        String message = getMessage();
        System.out.println("Message : "+message);
        System.out.println("Hash code of message : "+message.hashCode());
    }
}

输出为:

内部 尝试块
哈希代码 str : -832992604
在 final bolck 之前
在最终块之后
消息 : Hello world
消息的哈希代码 : -832992604

当我看到返回对象和调用对象具有相同的哈希码时,我感到非常惊讶。所以我对对象引用感到困惑。

请帮我澄清这个基本面。


答案 1

该方法不会完全返回对象。它返回对对象的引用。引用引用的对象在方法调用内部和外部保持不变。因为它是相同的对象,所以哈希码将是相同的。

时的值是对字符串“Hello World”的引用。return 语句读取 的值并将其另存为方法的返回值。strreturn strstr

然后运行最后的块,它有机会通过包含自己的返回语句来更改返回值。更改 finally 块中的 值不会更改已设置的返回值,只有另一个 return 语句会更改。str

由于设置为 不起作用,因此您可以删除此类语句。一旦该方法返回,它就会超出范围,因此它对垃圾回收没有帮助。strnull


答案 2

基于 JLS 14.20.2 执行 try-catch-finally

If execution of the try block completes normally, then the finally block is executed, and then there is a choice:    
    If the finally block completes normally, then the try statement completes normally.
    If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S.

希望这有帮助:)


推荐