web-dev-qa-db-ja.com

AutoCloseableがnullの場合のリソースの試行

AutoCloseableとして宣言されているnull変数に対してtry-with機能はどのように機能しますか?

変数でcloseを呼び出そうとすると、これがnullポインター例外につながると想定しましたが、問題はありません。

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

Java Language Specificationは、セクション 14.20.3。try-with-resources :でnull以外の場合にのみ閉じることを指定しています。

リソースは、null以外の値に初期化された場合にのみ閉じられます。

これは、リソースが時々存在し、他のリソースが存在しない場合に実際に役立ちます。

たとえば、リモートロギングシステムへのクローズ可能なプロキシがある場合とない場合があります。

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

参照がnullでない場合、予想どおりリモートロガープロキシが閉じられます。ただし、参照がnullの場合、その参照に対してclose()の呼び出しは試行されず、NullPointerExceptionはスローされず、コードは引き続き機能します。

51
Andy Thomas