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

问题描述 投票:0回答:4

目前我正在致力于代码优化,我正在使用 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
终于在之前
在finally块之后
留言:世界你好
消息哈希码:-832992604

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

请帮我理清这个基础。

java try-catch try-catch-finally
4个回答
12
投票

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

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

然后运行finally块,它有机会通过包含自己的内容来更改返回值 返回声明。更改 finally 块中

str
的值不会更改已设置的值 返回值,只有另一个 return 语句才会。

因为将

str
设置为
null
没有效果,所以可以删除这样的语句。无论如何,一旦方法返回,它就会超出范围,因此它对垃圾收集没有帮助。


1
投票

基于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.

希望这有帮助:)


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]

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


0
投票

为了更好地理解它是如何工作的。

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

输出将是:-

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

我们可以看到,在我们修改

StringBuilder
之前,已经设置了要返回的内容。它不返回修改后的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.