gpt4 book ai didi

java - 尝试使用 Return 语句进行 Catch 和 Final 操作

转载 作者:行者123 更新时间:2023-11-30 03:58:54 24 4
gpt4 key购买 nike

当我准备 Java 认证时,我见过一些这样棘手的代码。

这里最后的返回值是:10,但是调用finally并将returnval修改为20。

有人可以解释一下为什么会这样吗?是因为 catch 的 returnval 范围不同吗?或者我在这里遗漏了一些东西。

class MultipleReturn {
int getInt() {
int returnVal = 10;
try {
String[] students = {"Harry", "Paul"};
System.out.println(students[5]);
}
catch (Exception e) {
System.out.println("About to return :" + returnVal);
return returnVal;
}
finally {
returnVal += 10;
System.out.println("Return value is now :" + returnVal);
}
return returnVal;
}

public static void main(String args[]) {
MultipleReturn var = new MultipleReturn();
System.out.println("In Main:" + var.getInt());
}
}

另一段后续代码是:

class MultipleReturn {
StringBuilder getStringBuilder() {
StringBuilder returnVal = new StringBuilder("10");
try {
String[] students = {"Harry", "Paul"};
System.out.println(students[5]);
}
catch (Exception e) {
System.out.println("About to return :" + returnVal);
return returnVal;
}
finally {
returnVal.append("10");
System.out.println("Return value is now :" + returnVal);
}
return returnVal;
}

public static void main(String args[]) {
MultipleReturn var = new MultipleReturn();
System.out.println("In Main:" + var.getStringBuilder());
}
}

这里的输出是 1010,这是有意义的,因为最后修改了 returnval 并且它被持久化。

任何解释都会有帮助。

我确实明白这是写得不好的代码,任何头脑正常的人都不应该编写这样的代码。

最佳答案

在第一个示例中,finally 不会更改任何内容,因为 10 已被标记为要在 catch 语句中返回的值。如果将 return 添加到 finally block 或从 catch 中删除 return 并仅保留最后一个 return 语句,则将得到值 20。最重要的是你在这里只返回值而不是引用。

另一方面,在第二个示例中,StringBuilder 是可变的,returnVal 是对该对象的引用。值为“10”的 returnVal 被标记为要返回的值,但在执行 main 方法 finally block 内的 returnVal 值之前,它将 returnVal 的值从“10”更改为“1010” ”。如果您在 main 方法中打印 returnVal ,您将获得该对象的最新值,即“1010”。它的工作原理与此类似,因为 getStringBuilder 返回可变的 StringBuilder 的引用。

关于java - 尝试使用 Return 语句进行 Catch 和 Final 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22408428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com