2015-01-20 17 views
6

Dies könnte eine sehr grundlegende Frage sein, aber ich weiß immer noch nicht die Antwort.Warum wirft System.out.println() keine NullPointerException?

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

Warum System.out.println print "null" und nicht NullPointerException wirft?

+4

Es verwendet String.valueOf und es behandelt null –

+1

Es dereferenziert das Objekt nicht vor der Überprüfung ist es "null". –

+1

Jede Methode, die einen Nullparameter annimmt, sollte keine NPE werfen. Wenn Sie NULL nicht als Argument erwarten, sollte IllegalArgumentExcepion verwendet werden. – Cfx

Antwort

5

Weil es erreicht schließlich die print Methode, die „Null“ druckt für ein nullString:

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

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

Das gleiche Verhalten (in diesem Fall des „Null“ String zurück zum Drucken einer Nullreferenz existiert, durch 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

Sie können nur einen Blick auf PrintStream Quellcode:

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

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

Wie Sie nur Druck „Null“ behandelt sehen kann, ist der null Fall.

1

null ist speziell im Inneren der Druckfunktion verrohrten:

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

Es verhält sich so, wie es dokumentiert ist. PrintStream.println(String) ist dokumentiert als:

Druckt einen String und beendet dann die Zeile. Diese Methode verhält sich so, als ob sie print(String) und dann println() aufruft.

PrintStream.print(String) wird dokumentiert, wie:

eine Zeichenfolge gedruckt wird. Wenn das Argument null ist, wird die Zeichenfolge "null" gedruckt. Andernfalls werden die Zeichen der Zeichenfolge gemäß der standardmäßigen Zeichencodierung der Plattform in Bytes konvertiert, und diese Bytes werden genau wie in der Methode write(int) geschrieben.

Im Zweifelsfall lesen Sie die Dokumentation :)

0

Nach PrintStream#println()

ein Objekt Druck und dann die Linie beenden. Diese Methode ruft zuerst String.valueOf (x) auf, um den Zeichenfolgenwert des gedruckten Objekts abzurufen, und verhält sich dann so, als ob sie print (String) und dann println() aufruft.

Nach String#valueOf

Gibt die Stringdarstellung des Objekts Argument. Wenn das Argument null ist, dann eine Zeichenkette gleich "null"; Andernfalls wird der Wert von obj.toString() zurückgegeben.

0

Quellcode der System.out.print-Funktion.Wenn die Druck String null ist, setzt es auf „null“

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

Nun, in einigen Fällen System.out.println eine NullPointerException werfen könnte machen Sie denken, dass ist, wie es funktioniert.

Wenn Sie ein komplexes Objekt haben, in dem Sie Ihre eigene toString()-Methode erstellt haben, besteht die Möglichkeit, dass der Fehler innerhalb dieser Methode auftritt. Sie könnten entweder versehentlich oder absichtlich so programmieren, dass das NPE auftritt. Das Objekt selbst ist nicht null, jedoch können einige der darin enthaltenen Attribute null sein.

Eine solche Codierung sollte höchstwahrscheinlich entmutigt werden, da sie den Vertrag bricht, wie andere darauf hingewiesen haben. Das gewünschte Verhalten besteht darin, ein Nullobjekt als null darzustellen und nicht NPE zu werfen.

Verwandte Themen