2017-03-08 3 views
4

In Java verstehe ich, dass intern, wenn wir Objektreferenz drucken, toString() aufgerufen wird. Standardmäßig wird toString() in diesem Format "classname @ hashcode" ausgeben. Wenn dies der Fall ist, sollte das folgende Snippet die Null Pointer-Ausnahme auslösen. Warum passiert das nicht?Druckt null, aber löst keine Ausnahme aus

int[][] a = new int[3][]; 
System.out.println(a); --> Prints [[email protected] 
System.out.println(a[0]); --> Prints null (It should have thrown Null pointer Exception?) 

Könnte jemand mir helfen, dies zu verstehen?

+0

Mögliche Duplikat [Was für eine Nullpointer ist, und wie kann ich es beheben?] (http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-fix-it) –

+1

Die OP versucht nicht, eine NPE zu beheben, sondern versucht, herauszufinden, warum Es wird kein einziges geworfen. – azurefrog

+3

Das erste println druckt eine Objektreferenz, die den Standardformatierer verwendet, während die zweite einen Zeiger druckt. Die Ausgabe eines Zeigers führt nicht zur Dereferenzierung des Zeigers, sondern nur zum Ausdrucken. Und Java hat den Formatierer überladen, um nach Null zu suchen und "Null" zu drucken. Irgendwie nett. – ScottK

Antwort

4

Das passiert, weil println()toString() nicht aufruft. Stattdessen ruft es String.valueOf(x) auf, das überprüft, ob xnull ist, um NullPointerException zu verhindern.

Schauen Sie sich diese Dokumentation Seiten (oder schauen Sie in den Quellcode von PrintStream):

PrintStream.println(Object)

String.valueOf(Object)

+0

Vielen Dank. Ich habe den Quellcode überprüft. public static String Mehr ... valueOf (Objekt obj) { return (obj == null)? "null": obj.toString(); } – Javask

+0

Übrigens: 'System.out.println (String.valueOf (null));' ruft eine NPE auf. –

+1

@Abhijith das ist, weil 'String.valueOf (null)' geht zu der 'static String valueOf (char data [])' Methode. Das liegt daran, dass der Compiler die * spezifischste * Methode aufruft, die passt. Und die Methode, die 'Object' verwendet, ist offensichtlich weniger spezifisch als die Methode, die' char [] 'benötigt. Sie können hier nachsehen: http://StackOverflow.com/a/1572499/1553934 – esin88

0

println prüft auf null und druckt stattdessen null, ohne toString aufzurufen. Es ist ungefähr wie folgt: println (Objekt x) {out.append ((x! = Null)? X.toString(): "null"); out.append ("\ n"); }

0

a ist nicht null, erklären Sie, was für ein in der ersten Zeile ist int[][] a = new int[3][]; Sie nie a[0] jedoch erklären oder so eingestellt, dass es null ist. Sie können diesen Wert drucken und diesen Wert übergeben, ohne eine Nullzeigerausnahme zu verursachen. Sie erhalten eine Nullzeigerausnahme, wenn Sie versuchen, eine Methode für einen Nullwert aufzurufen. Sie würden also eine Nullzeigerausnahme erhalten, wenn Sie a[0].toString() oder eine andere Methode für diesen Nullwert aufgerufen haben.

https://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html

1

Es weil in einem 2D-Array definiert ist als [x] [y] x der Index, der die Referenz des y hält, die eine Anordnung von Elementen y ist.

Also, wenn Sie System.out.println(a); ausgedruckt wurde gab es seine toString Darstellung. Und wenn Sie als System.out.println angefragt haben (a [0]); es hatte eine Nullreferenz, daher druckte es null

Verwandte Themen