2016-12-03 67 views
1

的基值在java中在打印时字符数组它给零指示字例外,但在整数数组的情况下,它打印空字符数组VS在Java int数组而打印阵列

public class Test { 
    char c[]; 
    int a[]; 
    //while printing c it gives null pointer exception 
    public static void main(String[] args) { 
     System.out.println(new Test().c); 
     // in case of integer it prints null 
     System.out.println(new Test().a); 
    } 
} 
+3

什么问题 –

+0

'println'重载为'char []',所以它的行为有所不同。 – 4castle

+0

请详细解释。 –

回答

2

作为4Castle建议,其原因是

System.out.println(...); 

不只是1层的方法,而是很多很多不同的方法采取不同的参数

enter image description here

这是Java称为方法重载

的源代码的背后:

的println正在呼叫打印

打印正在呼叫写入

如果write(..)正在使用一个char[]然后NPE正在发生的事情,因为代码试图(等等)来得到被空引用

private void write(char buf[]) { 
     try { 
      synchronized (this) { 
       ensureOpen(); 
       textOut.write(buf); 
       textOut.flushBuffer(); 
       charOut.flushBuffer(); 
       if (autoFlush) { 
        for (int i = 0; i < buf.length; i++) 
         if (buf[i] == '\n') 
          out.flush(); 
       } 
      } 
     } 

在另一方面数组的长度,打印int[]将结束成主叫println(Object x)哪里String.valueOf调用

public void println(Object x) { 
    String s = String.valueOf(x); 
    synchronized (this) { 
     print(s); 
     newLine(); 
    } 
} 

,正如你可以看到

public static String valueOf(Object obj) { 
     return (obj == null) ? "null" : obj.toString(); 
} 

valueOf(null)个回报 :)

1

至于建议,为的println在你的问题行为的原因,是不同的重载的System.out.println(...)方法越来越被称为

  • 在INT的情况下[]: - 公共无效的println(对象X)

  • 在炭[]的情况下: - 公共无效的println(字符X [])

不想从Jdk源代码复制粘贴。

  1. 第一种方法首先调用将String.valueOf(X),这在 的情况下返回null。然后有一个print(s)方法调用,如果传递的参数为null,则会打印null 。

  2. 第二种方法抛出NPE,空指针异常如果通过 参数为空。