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

时间:2015-01-02 06:58:00

标签: java try-catch try-catch-finally

目前我正在进行代码优化,我正在使用try .. finally阻止我的对象。

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

在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
  在最后鲍尔之前   在最后一次阻止之后   消息:你好世界
  消息的哈希码:-832992604

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

请帮我清楚这个根本。

3 个答案:

答案 0 :(得分:12)

该方法不会完全返回对象。它返回对象的引用。那个对象 reference是指在方法调用的内部和外部保持相同。因为它是同一个对象,所以 hashcode将是相同的。

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

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

由于将str设置为null无效,您可以删除此类语句。一旦方法返回,它就会超出范围,因此它对垃圾收集没有帮助。

答案 1 :(得分: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.

希望这有帮助:)

答案 2 :(得分:0)

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

  

返回此字符串的哈希码。 String对象的哈希码计算为    s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]

由于两个String具有相同的值,因此哈希码当然是相同的。