2015-01-20 20 views
6

Questa potrebbe essere una domanda molto semplice, ma non conosco ancora la risposta.Perché System.out.println() non lancia NullPointerException?

String abc = null;  
System.out.println(abc); 

Perché System.out.println stampa "nullo" e non buttare NullPointerException?

+4

Utilizza String.valueOf e gestisce null –

+1

Non disferenzia l'oggetto prima di controllarlo 'null'. –

+1

Qualsiasi metodo che prenda un parametro null non dovrebbe lanciare un NPE. Se non ci si aspetta nulla come argomento, si dovrebbe usare UnlegalArgumentExcepion. – Cfx

risposta

5

Poiché raggiunge infine il metodo print, che stampa "nullo" per un nullString:

public void println(String x) { 
    synchronized (lock) { 
     print(x); 
     println(); 
    } 
} 

public void print(String s) { 
    if (s == null) { 
     s = "null"; 
    } 
    write(s); 
} 

esiste lo stesso comportamento per la stampa di qualsiasi riferimento nullo (in questo caso la stringa "null" viene restituito da String.valueOf (null):

public void println(Object x) { 
    String s = String.valueOf(x); 
    synchronized (lock) { 
     print(s); 
     println(); 
    } 
} 

public static String valueOf(Object obj) { 
    return (obj == null) ? "null" : obj.toString(); 
} 
2

Si può solo dare un'occhiata al codice sorgente di PrintStream:

public void println(String x) { 
    synchronized (this) { 
     print(x); 
     newLine(); 
    } 
} 

public void print(String s) { 
    if (s == null) { 
     s = "null"; 
    } 
    write(s); 
} 

Come si può vedere, il caso null è gestita da solo la stampa di "null".

1

Null è caso speciale all'interno della funzione di stampa:

public void print(String s) { 
    if (s == null) { 
    s = "null"; 
    } 
    write(s); 
} 
10

Si comporta come è documentato. PrintStream.println(String) è documentato come:

Stampa una stringa e quindi termina la linea. Questo metodo si comporta come se invochi print(String) e quindi println().

PrintStream.print(String) è documentato come:

di stampare una stringa. Se l'argomento è null, viene stampata la stringa "null". In caso contrario, i caratteri della stringa vengono convertiti in byte in base alla codifica dei caratteri di default della piattaforma e questi byte vengono scritti esattamente nel modo in cui viene applicato il metodo write(int).

caso di dubbio, leggere la documentazione :)

0

Secondo PrintStream#println()

Stampa un'oggetto e quindi terminare la linea. Questo metodo chiama dapprima String.valueOf (x) per ottenere il valore di stringa dell'oggetto stampato, quindi si comporta come se inviasse la stampa (String) e quindi println().

Secondo String#valueOf

Restituisce la rappresentazione in formato stringa dell'argomento oggetto. Se l'argomento è nullo, allora una stringa uguale a "null"; in caso contrario, viene restituito il valore di obj.toString().

0

Codice sorgente funzione System.out.print.Se stringa di stampa è nullo, imposta su "null"

public void print(String s) { 
if (s == null) { 
    s = "null"; 
} 
write(s); 
} 
0

bene in alcune circostanze, System.out.println potrebbe gettare un NullPointerException facendo si pensa che è così che funziona.

Se si dispone di un oggetto complesso in cui è stato creato il proprio metodo toString(), è possibile che si verifichi l'errore all'interno di tale metodo. Si potrebbe accidentalmente o intenzionalmente codificare in modo tale che l'NPE si verifica. L'oggetto stesso non è nullo, tuttavia alcuni degli attributi interni potrebbero essere nulli.

Tale codifica dovrebbe molto probabilmente essere scoraggiato, anche perché interrompe il contratto come altri hanno sottolineato. Il comportamento desiderato è rappresentare un oggetto nullo come null e non viene generata NPE.

Problemi correlati