char和int数组的区别

Sha*_*wal 17 java

当我尝试打印未初始化的静态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方法.在你的情况下:

  1. System.out.println(ch); 正在使用 public void println(char x[])
  2. 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)

而且由于cbufnull cbuf.length将抛出NullPointerException异常,因为null没有length(或任何其他)领域.