char和int数组的区别
当我尝试打印未初始化的静态字符数组时,它会给出运行时错误(空指针exception),而未初始化的静态int数组则给出空值。 为什么?
public class abc { static int arr[]; static char ch[]; public static void main(String[] args) { System.out.println(ch); //it gives null pointer exception at run time System.out.println(arr); //it gives output as "null". } }
System.out
是PrintStream
一个实例,这个类有一些重载的println
方法。 在你的情况下:
-
System.out.println(ch);
正在使用public void println(char x[])
-
System.out.println(arr);
正在使用public void println(Object x)
(没有public void println(int[] x)
方法,因此println
可以使用的int[]
最接近的可用类型是Object
)。
第二种方法是使用
String.valueOf(x);
获取我们要打印的对象的字符串表示, valueOf
方法的代码如下所示
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
所以它是null安全的(如果引用保持为null
将返回字符串"null"
)。
第一种方法是在某种程度上使用
public void write(char cbuf[]) throws IOException { write(cbuf, 0, cbuf.length); // ^^^^^^^ this throws NPE }
并且因为cbuf
为null
cbuf.length
将抛出NullPointerException,因为null
没有length
(或任何其他)字段。
答案存在于PrintWriter
源代码中(其中System.out
是一个实例)。
首先,未初始化的数组作为引用变量,默认为null
。
println(char[])
(最终)尝试在传入的数组中调用.length
。 它为null,导致NullPointerException
。 println(char[])
(最终)调用write(char[])
:
public void write(char buf[]) { write(buf, 0, buf.length); }
println
没有匹配int[]
重载,但是有一个println(Object)
。 在那里(最终)尝试String.valueOf
,传递null
引用,因此String.valueOf
获取null
并返回String
"null"
。 println(Object)
调用print(Object)
:
public void print(Object obj) { write(String.valueOf(obj)); }
这是两种不同的方法,它们的API完全描述了这种行为。
public void println(Object x)
首先调用String.valueOf,如果x为null,则返回“null”。
看到:
- http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-java.lang.Object-
- http://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-
public void print(char[] c)
调用print(char [] c)方法,如果c为null,则抛出NullPointerException。
看到:
您实际上正在调用两个单独的,重载的System.out.println()
方法。 public void println(char[] x)
按照文档重载。 int[]
数组不存在println(Object x)
特定重载。
因此,当在整数数组上调用println()
将调用public void println(Object x)
。 根据Javadocs:
此方法首先调用String.valueOf(x)来获取打印对象的字符串值,然后表现为调用print(String)然后调用println()。
由于字符串的值为null
,因此该方法打印为null。
当将字符数组作为参数时, println()
方法的工作方式有所不同。 从表面上看,该方法本身似乎相似:
打印一个字符数组,然后终止该行。 此方法的行为就像调用print(char [])然后调用println()一样。
但是, print(char[])
方法在关键方面表现完全不同:
打印一个字符数组。 根据平台的默认字符编码将字符转换为字节,这些字节的写入方式与write(int)方法完全相同。
因此,它称之为不同的方法。 print(char[])
的文档明确指出在您的情况下,抛出exception:
抛出:NullPointerException – 如果[input parameter] s为null
因此,行为差异的原因。
有关println
和print
方法的更多信息,请参阅Javadocs: http : //docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println()