char和int数组的区别

时间:2014-07-18 20:48:16

标签: java

当我尝试打印未初始化的静态字符数组时,它会给出运行时错误(空指针异常),而未初始化的静态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".
        }
    }

4 个答案:

答案 0 :(得分:15)

答案存在于PrintWriter源代码中(其中System.out是一个实例)。

首先,作为参考变量的未初始化数组的默认值为null

println(char[])(最终)尝试在传入的数组中调用.length。它为空,产生NullPointerExceptionprintln(char[])(最终)调用write(char[])

public void write(char buf[]) {
    write(buf, 0, buf.length);
}

匹配println的{​​{1}}没有重载,但有一个int[]。在那里(最终)尝试println(Object),传递String.valueOf引用,因此null获取String.valueOf并返回null String"null"来电println(Object)

print(Object)

答案 1 :(得分:13)

System.outPrintStream的一个实例,此类有一些重载的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 )。
  3. 第二种方法是使用

    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
    }
    

    并因为cbufnull cbuf.length会抛出NullPointerException,因为null没有length(或任何其他)字段。

答案 2 :(得分:2)

这是两种不同的方法,它们的API完全描述了这种行为。

public void println(Object x)首先调用String.valueOf,返回" null"如果x为空。

请参阅:

public void print(char[] c)调用print(char [] c)方法,如果c为null,则抛出NullPointerException。

请参阅:

答案 3 :(得分:0)

您实际上正在调用两个独立的,重载的System.out.println()方法。根据文档,public void println(char[] x)已超载。 println(Object x)数组不存在int[]的特定重载。

因此,当在整数数组上调用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[])的文档明确指出,在您的情况下,您的异常将被抛出:

  

抛出:NullPointerException - 如果[input parameter] s为null

因此,行为差异的原因。

有关printlnprint方法的详细信息,请参阅Javadocs: http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println()