当前位置: 首页 > 知识库问答 >
问题:

当AutoCloseable为空时,请尝试使用资源

彭涵衍
2023-03-14

try-with 功能如何适用于已声明为 null 的可自动关闭变量?

我假设这会导致空指针异常,当它尝试调用关闭上的变量,但它运行没有问题:

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

共有1个答案

苗康平
2023-03-14

Java语言规范在第14.20.3节中规定,只有在非空时才关闭它。请尝试使用资源:

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

这实际上是有用的,当一个资源有时可能存在,而没有其他资源时。

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

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

如果引用为非null,则远程记录器代理将关闭,正如我们所期望的那样。但如果引用为null,则不会尝试对其调用close(),也不会引发NullPointerException,代码仍然有效。

 类似资料:
  • 我知道,如果资源已实现自动关闭,您通过尝试传递的资源将自动关闭。到现在为止,一直都还不错。但是,当我有几个我想要自动关闭的资源时,我该怎么办呢。带插座的示例; 所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但是输入和输出应该如何正确关闭呢?

  • 我在中有一个JSON文件,我试图用以下方式读取该文件: 但是,InputStream为空。 这是我传递的文件路径: 我做错了什么?

  • 我的系统中有以下配置: Apache Maven 3.5.2 Maven主页: /usr/share/mavenJava版本:1.8.0_162,供应商:Oracle CorporationJava主页: /usr/lib/jvm/java-8-openjdk-amd64/jre默认语言环境:en_US,平台编码:UTF-8操作系统名称:"linux",版本:"4.15.0-20-通用", arc

  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall

  • 我用Java做了一个游戏。它在Eclipse中工作得非常好。 我把它导出为一个可运行的罐子。当双击它的图标时,它不会打开。所以我试着从命令行运行JAR。 在试图检索图像资源的一行代码中,我遇到了一个NullPointerException错误(正如我所说,它在Eclipse中工作得很好)。这是发生错误的代码行: 我不知道出了什么问题。这是我项目的结构: 有什么想法吗?我开始绝望了。 非常感谢你的帮

  • 我认为流API在这里是为了使代码更易于阅读。我觉得有点烦。流接口扩展了java。lang.AutoCloseable接口。 因此,如果你想正确地关闭流,你必须使用try-with资源。 清单1.不是很好,流没有关闭。 清单2.使用2嵌套try 清单3。当map返回流时,必须关闭stream()和map()函数。 我举的例子毫无意义。为了示例,我将jpg图像的路径替换为整数。但不要让这些细节分散你的