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