Подтвердить что ты не робот

Попробовать с ресурсом, когда AutoCloseable имеет значение null

Как работает функция try-with для переменных AutoCloseable, которые были объявлены null?

Я предположил, что это приведет к исключению нулевого указателя, когда он попытается вызвать close для переменной, но он не работает:

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

Ответ 1

Спецификация языка Java указывает, что она закрыта только в том случае, если она не равна нулю, в разделе 14.20.3. примерочных с-ресурсы:

Ресурс закрывается, только если он инициализируется ненулевым значением.

Это может быть полезно, когда ресурс может иногда присутствовать, а другие отсутствуют.

Например, скажем, у вас может быть или не быть закрытого прокси-сервера для какой-либо удаленной системы ведения журнала.

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

Если ссылка не равна нулю, прокси-сервер удаленного журнала закрывается, как мы и ожидаем. Но если ссылка имеет значение null, не делается попытки вызвать на ней функцию close(), не возникает исключение NullPointerException, и код все еще работает.