2016-12-03 3 views
1

В Java во время печати массива символов дает исключение нулевого указателя, но в случае целого массива печатает нулевоймассива символов против Int массива в Java во время печати базового значения массива

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(...); 

не только один метод, но вместо того, чтобы много много различных методов, принимая различные параметры

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 (Объект х)

  • В случае полукокса []: - общественной недействительная Println (символ х [])

Не хотите копировать пасту из исходного кода Jdk.

  1. Первый метод сначала вызывает String.valueOf (х), которая возвращает нуль в вашем случае. Затем есть вызов метода print (s), который печатает null , если аргумент передан, равен null.

  2. Второй метод выбрасывает NPE, исключение нулевого указателя в случае передачи аргумент null.

Смежные вопросы