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

How try...finally works internally

目前我正在使用 try..finally 块来优化我的对象。

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

当return在try块中调用一个对象时,它会在编译过程中创建一个预编译语句吗?或者在涉及 return 语句时在堆中创建新引用?或者只是 return 对象的当前引用?

下面是我的研究代码。

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

输出为:

Inside Try Block
Hash code of str : -832992604
in finally bolck before
in finally block after
Message : Hello world
Hash code of message : -832992604

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

请帮我弄清楚这个基础。

Hashcode() 不用于显示引用。相反,哈希码用于检查 2 个字符串是否彼此相等。请参考http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#hashCode()

Returns a hash code for this string. The hash code for a String object is computed as s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

既然两个字符串都具有相同的值,那么哈希码当然是相同的。

基于JLS 14.20.2 Execution of 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.

希望对您有所帮助:)

该方法不完全是 return 一个对象。它 return 是对对象的引用。该对象 引用是指在方法调用内外保持不变。因为是同一个对象, 哈希码将相同。

strreturn str 时的值是对字符串 "Hello World" 的引用。 return 语句读取 str 的值并将其保存为方法的 return 值。

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

因为设置strnull没有效果,你可以去掉这样的语句。一旦方法 returns 无论如何,它就会超出范围,因此它对垃圾收集没有帮助。