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;

请使用代码格式。