Try-With Resource, когда AutoCloseable имеет значение null

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

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

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам