2016-02-12 25 views
15

Come funziona la funzione try-with per le variabili AutoCloseable dichiarate null?Risorsa di prova quando AutoCloseable è nullo

ho assunto questo porterebbe a un'eccezione di puntatore nullo quando tenta di richiamare close sulla variabile, ma si corre nessun problema:

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

risposta

22

Il linguaggio Java Specification specifica che si è chiuso solo se non null, nella sezione 14.20.3. try-with-resources:

Una risorsa viene chiusa solo se inizializzata su un valore non nullo.

Questo può effettivamente essere utile, quando una risorsa potrebbe presentarsi a volte e in assenza di altre.

Ad esempio, supponiamo che sia possibile o meno disporre di un proxy chiudibile per alcuni sistemi di registrazione remota.

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

Se il riferimento non è nullo, il proxy del logger remoto viene chiuso, come previsto. Ma se il riferimento è nullo, non viene effettuato alcun tentativo di chiamare close() su di esso, non viene generata alcuna NullPointerException e il codice funziona ancora.

+1

Haha, il caso d'uso che hai appena aggiunto è quello che mi ha fatto fare la domanda in primo luogo! Grazie! – flakes

+0

Niente da fare! È selvaggio L'ho appena inventato. –

+0

Bene ,. diversi tipi di variabili, ma stessa struttura: p – flakes