我需要解释下面的代码 .
public class ReturnValueFromTryCatchFinally
{
public static void main(String[] args)
{
System.out.println(methodReturningValue());
}
static String methodReturningValue()
{
String s = null;
try
{
s = "return value from try block";
return s;
}
catch (Exception e)
{
s = s + "return value from catch block";
return s;
}
finally
{
s = s + "return value from finally block";
}
}
}
我的理解是最终块将始终执行,因此s的值将是“从最后块的try块返回值返回值” . 但是上面的代码给出了try块的s值 . 即;从try块返回值 . 为什么s的值从try块返回 . 据我所知,最后块将始终执行 . 那么s的 Value 不会改变吗?在try,catch块中有关于变量范围的任何我需要理解的东西 .
这不仅发生在字符串上 . 即使我从try块返回整数,它也会发生 .
3 回答
最终的 s 将被更改,但它不会影响 try 返回的内容 . 当您在 finally 中更改 s 时, s 将指向内存中另一个带有新文本的区域 . 但是try中的 return 已经指向 try 的文本,这不会改变 .
用这种方式可能更容易理解 . Java中的字符串是不可变的 . 如果更改字符串变量,则内存中的上一个文本不会更改 . 而是为新文本创建一个新变量文本"points" . 在 finally 块中,只需更改 s 指向的位置,即可更改 try 块的文本 .
如果您有其他类型的List,并且在 finally 块中添加或删除了元素,则会影响 try 返回的内容 .
我认为你只是简化了代码的可读性 . 对?因为在 try 块中没有异常是可能的,并且由于 catch 块,此代码将无法编译 .
是,最后将始终执行块 .
那么s的 Value 不会被改变吗?因为String是不可变的,所以try块中的
s
与finally块中的s
不同 . 分配s = s + "return value from finally block";
新内存时 . try块中的return
仍然引用旧的s
.您可以使用可变对象尝试相同的代码 .
@mentallurg
所以如果它以这种方式用于字符串 . 为什么以下程序也从try返回值
我们传递整数 . 所以它不应该返回3而不是1 .