【问题标题】:Try-With Resource when AutoCloseable is null当 AutoCloseable 为空时尝试使用资源
【发布时间】:2016-05-24 03:59:23
【问题描述】:

try-with 功能如何对声明为 nullAutoCloseable 变量起作用?

当它尝试在变量上调用close 时,我认为这会导致空指针异常,但它运行没有问题:

try (BufferedReader br = null){
    System.out.println("Test");
}
catch (IOException e){
    e.printStackTrace();
}

【问题讨论】:

    标签: java try-catch autocloseable


    【解决方案1】:

    Java 语言规范在14.20.3. try-with-resources 部分指定它仅在非空时关闭:

    只有在初始化为非空值时才关闭资源。

    这实际上很有用,当资源有时存在而其他资源不存在时。

    例如,假设您可能有也可能没有某个远程日志记录系统的可关闭代理。

    try ( IRemoteLogger remoteLogger = getRemoteLoggerMaybe() ) {
        if ( null != remoteLogger ) {
           ...
        }
    }
    

    如果引用不为空,则远程记录器代理将关闭,如我们所料。但是如果引用为 null,则不会尝试对其调用 close(),不会抛出 NullPointerException,并且代码仍然有效。

    【讨论】:

    • 哈哈,你刚刚添加的用例是让我首先提出问题的原因!谢谢!
    • 不可能!那是狂野的。我只是编的。
    • 嗯,。不同的变量类型,但结构相同:p
    • 还是很酷!很高兴看到语言设计者想到了这个案例。
    • 是的,抛出异常的代价更高。但通常,在 Java 中,与 Python 等语言相反,异常不用于控制流,而是用于解决问题。 Catch 块在名义情况下对性能没有影响。所以我喜欢它的原因是因为在名义上它更便宜。同样,我们谈论的是边际收益,因为它是用于空检查的额外的几个汇编语句,但我对计算的典型立场是“每一点都很重要”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2016-01-28
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多