2017-03-08 92 views
4

在Java中,我明白,每当我们打印对象引用,内部toString()将被调用。默认情况下,toString()将以这种格式打印“classname @ hashcode”。如果这是真的,那么下面的代码片段应该引发空指针异常。为什么没有发生?打印空,但不抛出异常

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?) 

有人能帮我理解吗?

+0

的可能的复制[什么是空指针异常,以及如何解决它?] (http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) –

+1

OP的并非试图修复NPE,而是试图找出原因没有人抛出。 – azurefrog

+3

第一个println正在打印使用默认格式化程序的对象引用,而第二个打印指针。输出一个指针不会取消引用指针,只是打印它。 Java有格式化程序重载来检查null并打印“null”。真的很好。 – ScottK

回答

4

发生这种情况是因为println()未调用toString()。相反,它调用String.valueOf(x),它检查x是否为null以防止NullPointerException

查看这些文档页面(或者只是看看的PrintStream源代码):

PrintStream.println(Object)

String.valueOf(Object)

+0

非常感谢。我检查了源代码。公共静态字符串更多... valueOf(Object obj){ return(obj == null)? “null”:obj.toString(); } – Javask

+0

顺便说一下:'System.out.println(String.valueOf(null));'调用一个NPE。 –

+1

@Abhijith这是因为'String.valueOf(null)'转到'static String valueOf(char data [])'方法。这是因为编译器选择调用适合的最具体的方法。而采用'Object'的方法显然不如采用'char []'的方法具体。你可以看看这里:http://stackoverflow.com/a/1572499/1553934 – esin88

0

为空的println检查,而不是打印空,而不调用toString。它是这样的:println(Object x){out.append((x!= null)?x.toString():“null”); out.append( “\ n”); }

0

a不为空,你声明什么是在第一行int[][] a = new int[3][];你永远不会声明或设置a[0]但是它是空的。您可以打印此值并传递此值而不会导致空指针异常。当您尝试调用空值的方法时,会出现空指针异常。因此,如果您调用a[0].toString()或其他任何其他方法,则会得到空指针异常。

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

1

它因为在定义为[X] [Y]的2D阵列x索引保持其为y元件的阵列的y的参考。

所以,当你打印System.out.println(a);它给它的toString representtion。 并且当你询问System.out.println(a [0])时;它有一个空引用,因此它打印null