AutoCloseable
として宣言されているnull
変数に対してtry-with機能はどのように機能しますか?
変数でclose
を呼び出そうとすると、これがnullポインター例外につながると想定しましたが、問題はありません。
try (BufferedReader br = null){
System.out.println("Test");
}
catch (IOException e){
e.printStackTrace();
}
Java Language Specificationは、セクション 14.20.3。try-with-resources :でnull以外の場合にのみ閉じることを指定しています。
リソースは、null以外の値に初期化された場合にのみ閉じられます。
これは、リソースが時々存在し、他のリソースが存在しない場合に実際に役立ちます。
たとえば、リモートロギングシステムへのクローズ可能なプロキシがある場合とない場合があります。
try ( IRemoteLogger remoteLogger = getRemoteLoggerMaybe() ) {
if ( null != remoteLogger ) {
...
}
}
参照がnullでない場合、予想どおりリモートロガープロキシが閉じられます。ただし、参照がnullの場合、その参照に対してclose()の呼び出しは試行されず、NullPointerExceptionはスローされず、コードは引き続き機能します。