当我尝试打印未初始化的静态char数组时,它会给出运行时错误(Null指针异常),而未初始化的静态int数组则给出null值.为什么?
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".
}
}
Run Code Online (Sandbox Code Playgroud)
rge*_*man 15
答案存在于PrintWriter源代码中(其中System.out一个实例).
从作为参考变量的未初始化数组赋予默认值的事实开始null.
该println(char[])(最终)试图调用.length在阵列传递.它是空的,导致了NullPointerException. println(char[])(最终)电话write(char[]):
public void write(char buf[]) {
write(buf, 0, buf.length);
}
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
Psh*_*emo 13
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)的方法,以便将最接近的可用类型int[],其println可以使用是Object).第二种方法是使用
String.valueOf(x);
Run Code Online (Sandbox Code Playgroud)
获取我们要打印的对象的字符串表示,valueOf方法的代码如下
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
Run Code Online (Sandbox Code Playgroud)
所以它是null安全的("null"如果引用成立,将返回字符串null).
第一种方法是在某种程度上使用
public void write(char cbuf[]) throws IOException {
write(cbuf, 0, cbuf.length);
// ^^^^^^^ this throws NPE
}
Run Code Online (Sandbox Code Playgroud)
而且由于cbuf是null cbuf.length将抛出NullPointerException异常,因为null没有length(或任何其他)领域.
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |