代码之家  ›  专栏  ›  技术社区  ›  flakes

AutoCloseable为空时尝试使用资源

  •  78
  • flakes  · 技术社区  · 8 年前

    试用功能如何适用于 AutoCloseable 已声明的变量 null ?

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

    try (BufferedReader br = null){
        System.out.println("Test");
    }
    catch (IOException e){
        e.printStackTrace();
    }
    
    1 回复  |  直到 8 年前
        1
  •  101
  •   Andy Thomas    8 年前

    Java语言规范规定,仅当非空时才关闭 14.20.3. try-with-resources :

    仅当资源初始化为非空值时,才关闭该资源。

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

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

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

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