2016-02-12 9 views
15

Jak działa funkcja próbna dla zmiennych AutoCloseable, które zostały zadeklarowane jako null?Try-With Resource, gdy AutoCloseable ma wartość null

Sądziłem, że prowadziłoby to do wyjątku null pointer kiedy próbuje wywołać close na zmienną, ale działa bez problemu:

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

Odpowiedz

22

Java Język Specyfikacja określa, że ​​jest on zamknięty tylko wtedy, gdy nie- null, w sekcji 14.20.3. try-with-resources:

Zasób jest zamykany tylko wtedy, gdy został zainicjowany na wartość inną niż null.

Może to być przydatne, gdy zasób może czasami występować, a nieobecny w innych.

Załóżmy na przykład, że możesz mieć lub nie mieć zamykalnego serwera proxy do zdalnego systemu logowania.

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

Jeśli odwołanie ma wartość inną niż null, serwer proxy zdalnego serwera zdalnego jest zamknięty, zgodnie z naszymi oczekiwaniami. Ale jeśli odwołanie ma wartość NULL, nie jest podejmowana próba wywołania metody close(), nie generowany jest wyjątek NullPointerException, a kod nadal działa.

+1

Haha, właśnie dodany przez ciebie przypadek, sprawił, że zadałem to pytanie w pierwszej kolejności! Dzięki! – flakes

+0

Nie ma mowy! To jest dzikie. Właśnie to wymyśliłem. –

+0

Dobrze. różne typy zmiennych, ale ta sama struktura: p – flakes

Powiązane problemy