【发布时间】:2024-01-20 17:48:01
【问题描述】:
目前我正在优化代码,我正在使用 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
终于在 bolck 之前
在 finally 块之后
消息:你好世界
消息哈希码:-832992604
当我看到返回对象和调用对象都具有相同的哈希码时,我感到非常惊讶。 所以我对对象引用感到困惑。
请帮助我清除这个基础。
【问题讨论】:
-
哈希码是根据内容创建的,而不是参考地址或其他东西。那么有什么困惑呢?
-
感谢您的及时回复。我的困惑是我在 finally 块中使我的对象为空。那么返回对象在哪里以及如何??
-
JLS-14.20.2. Execution of
try-finallyandtry-catch-finally可能有助于消除您对finally的困惑。需要注意的是,JavaString是不可变的。因此,您已经返回了该值的副本,您无法在 finally 中修改返回的实例。如果您返回StringBuilder并在 finally 中调用setLength(0),那么您将在调用者中获得零长度StringBuilder。 -
@prattpratt - 要返回的内容已经在 try 块中决定了。因此,除非您在
finally块中执行return str(在这种情况下,要返回的当前值将从堆栈顶部弹出并替换为更新的值,即 null),返回的值将是"Hello World". -
@TheLostMind - 感谢您的帮助。它将帮助我了解详细的基础知识。
标签: java try-catch try-catch-finally