【问题标题】:what would the output of the program? [duplicate]程序的输出是什么? [复制]
【发布时间】:2014-04-04 15:51:24
【问题描述】:

输出是测试通过!!!构建器在 finally 块中设置为 null 时如何返回

    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。也许你对 catch 块感到困惑
  • 你在 7 小时前就问过这个问题了......现在已经回答了

标签: java try-catch stringbuilder finally


【解决方案1】:

因为return 的结果是当时builder 引用的副本。

finally 代码中的builder = null; 不会更改此引用,而只是替换print 方法中builder 变量的当前值。

不过,请注意,如果您更改返回的对象引用的状态,这将影响返回值的结果。例如:

protected StringBuilder print() {
    StringBuilder builder = new StringBuilder();
    try {
        builder.append("Test ");
        return builder.append("Passed!!!");
    } finally {
        builder.append(" but modified!");
        //builder = null; 
    }
}

它将打印:

Test Passed!!! but modified!

【讨论】:

    【解决方案2】:

    finally 发生在其他所有事情之后。这意味着 builder 在返回之后将被设置为 null (当然,在调用者得到结果之前。

    请注意,在这种情况下,使 builder 为空并没有多大意义,因为 builder 变量即将超出范围,并且无论如何都会被垃圾收集清理掉。

    【讨论】:

      【解决方案3】:

      基本上,您返回了 StringBuilder 内容,然后将其设置为 null。

      【讨论】:

        【解决方案4】:

        finally 在 try 块之后执行,无论是否生成 execption。这是 Java 文档中的 link 供您参考。

        【讨论】:

          猜你喜欢
          • 2014-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-26
          • 2021-12-25
          • 1970-01-01
          • 2016-08-07
          • 1970-01-01
          相关资源
          最近更新 更多