打印null但不抛出异常

时间:2017-03-08 17:19:46

标签: java

在Java中,我理解无论何时打印对象引用,都会调用内部toString()。默认情况下,toString()将以此格式打印“classname @ hashcode”。如果这是真的,那么下面的代码片段应该引发空指针异常。为什么不会发生?

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

有人可以帮助我理解这个吗?

4 个答案:

答案 0 :(得分:4)

这是因为println()未调用toString()。相反,它会调用String.valueOf(x),检查xnull是否NullPointerException以阻止PrintStream

查看这些文档页面(或者只查看https://sandbox.bluesnap.com/services/2/subscriptions/:subscription-id的源代码):

PrintStream.println(Object)

String.valueOf(Object)

答案 1 :(得分:1)

因为在定义为[x] [y]的2D数组中,x索引保存y的引用,y是y元素的数组。

所以当你打印System.out.println(a);时,它给出了toString表示。 当你查询为System.out.println(a [0]);它有一个空引用,因此它打印为null

答案 2 :(得分:0)

println检查null并改为打印null,而不调用toString。它类似于:println(Object x){out.append((x!= null)?x.toString():“null”); out.append( “\ n”); }

答案 3 :(得分:0)

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

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