Java 打印空,但不打印';t抛出异常

Java 打印空,但不打印';t抛出异常,java,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 ha

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

有人能帮我理解这一点吗?

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

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


这是因为在定义为[x][y]的二维数组中,x索引包含y的引用,y是y元素的数组

所以当您打印
System.out.println(a)时它给出了它的toString表示。

当您作为System.out.println(a[0])查询时;它有一个null引用,因此它打印了null,这是因为
println()
没有调用
toString()
。相反,它调用
String.valueOf(x)
,检查
x
是否为
null
,以防止
NullPointerException

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


OP的可能副本不是试图修复NPE,而是试图找出没有抛出NPE的原因。第一个println打印使用默认格式的对象引用,而第二个println打印指针。输出指针不会取消对指针的引用,只是打印它。Java重载了格式化程序来检查null并打印“null”。真的很好,非常感谢。我已经检查了源代码。公共静态字符串More…valueOf(Object obj){return(obj==null)?“null”:obj.toString();}顺便说一句:
System.out.println(String.valueOf(null))
调用NPE。@Abhijith这是因为
String.valueOf(null)
转到
静态字符串valueOf(char data[])
方法。这是因为编译器选择调用最适合的特定方法。显然,采用
Object
的方法不如采用
char[]
的方法具体。你可以看看这里: