Java 将null赋值给finally块中的变量
以下代码的输出为“测试通过”;有人能给我解释一下原因吗Java 将null赋值给finally块中的变量,java,exception,try-catch,stringbuilder,finally,Java,Exception,Try Catch,Stringbuilder,Finally,以下代码的输出为“测试通过”;有人能给我解释一下原因吗 public class Test { public static void main(String args[]) { System.out.println(new Test().print()); } protected StringBuilder print() { StringBuilder builder = new StringBuilder(); try
public class Test {
public static void main(String args[]) {
System.out.println(new Test().print());
}
protected StringBuilder print() {
StringBuilder builder = new StringBuilder();
try {
builder.append("Test ");
return builder.append("Passed!!!");
} finally {
builder = null;
}
}
答案很简单
Finally
块肯定会执行,因为您没有从中返回任何值,所以try
块返回的值将传递给原始调用者
try {
builder.append("Test ");
return builder.append("Passed!!!");
} finally {
builder = null;
}
因此,您将获得“测试通过!!!”
将代码更改为
StringBuilder builder = new StringBuilder();
try {
builder.append("Test ");
return builder.append("Passed!!!");
} finally {
return null;
}
当然会像您预期的那样打印“null”基本上,Java所做的是:
StringBuilder valueToReturn = builder.append("Passed!!!");
executeFinallyBlock();
return valueToReturn;
无论您在finally块中做什么,Java都保留了对要返回的值的引用,并返回该引用。因此,它变成:
StringBuilder valueToReturn = builder.append("Passed!!!");
builder = null;
return valueToReturn;
请使用代码格式。