2012-03-30 1 views
3

Я кодирования для моего Applictation, я наткнулся на требование, где мне нужно, чтобы преобразовать строку в массив символов Iпочему он не бросает NullPointerException в этом случае

String str_a = "Testing"; 

char c[] = str_a.toCharArray(); 

for (char d : c) { 
    System.out.println(d); 
} 

Как я сделал не инициализировать char c[]

Мой вопрос, почему он не бросает NullPointerException, как правило, это должно быть сделано таким образом

char[] char_array = new char[str_a.length()]; 

char_array = str_a.toCharArray();  

for (char d : c) { 
    System.out.println(d); 
} 

ответ

3

Исходный код toCharArray():

/** 
* Converts this string to a new character array. 
* 
* @return a newly allocated character array whose length is the length 
*   of this string and whose contents are initialized to contain 
*   the character sequence represented by this string. 
*/ 
public char[] toCharArray() { 
    char result[] = new char[count]; // <-- Here is the initialization :) 
    getChars(0, count, result, 0); 
    return result; 
} 
+0

Спасибо, это было хорошее объяснение – Pawan

5

Потому что str_a.toCharArray(); уже инициализирует и выделяет правильный массив символов. То, что этот метод возвращает, уже выполнило выделение и инициализацию для вас.

+0

Чтобы добавить к этому, если вы должны были присвоить пустой массив 'char_array' перед вызовом' toCharArray () ', исходный массив теперь должен получить GC'd. –

+0

Здесь * есть * места на Java, где целевой массив выделяется вызывающим, но для всех этих API требуется передать в целевом массиве параметр. Например, см. «InputStream.read (...)». –

1

Нет необходимости инициализировать char_array, когда вы сразу же назначаете результат str_a.toCharArray() на char_array.

Во втором примере вы создаете пустой массив, который сразу же выбрасывается, потому что вы затем вычисляете str_a.toCharArray(). Метод toCharArray вычисляет значение массива и возвращает его, поэтому вам не нужно создавать его самостоятельно.

1

Оба метода прекрасно работают. Первый определяет новый массив как массив символов, а второй создает пустой массив и устанавливает его равным массиву символов; когда вы приступаете к нему, оба они одинаковы, но у второго просто больше линий.

Вы также можете сэкономить время и сделать:

for(char c : str_a.toCharArray()){ 
    System.out.println(c); 
} 
0

Метод string.toCharArray() возвращает новый char[], нет необходимости инициализировать переменную на что-то другое первое.

Infact, если вы оставили свой код как ...

char[] char_array = new char[str_a.length()]; 
char_array = str_a.toCharArray(); 

Это инициализирует переменную к одному экземпляру char[], а затем выбросить этот экземпляр далеко на следующей строке. Это неэффективно, бессмысленно и запутанно.

0

, как показано в коде вы используете переменную C, но вместо того, чтобы с вы должны использовать char_arra

char[] char_array = new char[str_a.length()]; 

char_array = str_a.toCharArray();  

for (char d : char_array) { 
      System.out.println(d); 
     } 
Смежные вопросы