2012-03-30 182 views
3

我编码为我Applictation抛出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 2012-03-30 17:54:57

5

因为str_a.toCharArray();已经初始化并分配了一个合适的字符数组。这个方法返回的东西已经为你分配和初始化了。

+0

要添加到的是,如果是调用'toCharArray之前分配一个空数组'char_array'( )',原来的数组现在需要GC'd。 – 2012-03-30 17:54:04

+0

*有*位置在目标数组由调用者分配的Java中,但这些API都要求您传入目标数组作为参数。例如,请参阅'InputStream.read(...)'。 – 2012-03-30 17:55:12

1

当您立即将str_a.toCharArray()的结果指定为char_array时,无需初始化char_array

在你的第二个例子,你创建它扔掉就因为你然后计算str_a.toCharArray()空数组。方法toCharArray计算数组的值并将其返回,因此您不必自己创建一个数组。

1

这两种方法都工作得很好。第一个将新数组定义为char数组,第二个创建一个空数组并将其设置为等于char数组;当你认真对待它时,两者都是一样的,但第二条只是有更多的线条。

您也可以节省一些时间,做:

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

string.toCharArray()返回一个新的char[]的方法,无需别人先初始化变量的东西。

逸岸,如果你离开你的代码...

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

这将变量初始化为char[]的一个实例,然后把那个实例上移开就非常下一行。这是低效的,毫无意义的,令人费解的。

0

在代码中所示使用的是变量c但不是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); 
     } 
相关问题