2013-07-22 72 views
2

期间分配空我在java.Now我正在pratice.Actually过程中面临的问题,我想从一个StringTokenizer类得到的字符串令牌和想分配这些令牌字符串数组初学者。但我得到空指针异常。我的代码在这里。空指针异常与初始化

public class Token { 
    public static void main(String str[]) 
    { 
     String str1="This is my first page"; 
     StringTokenizer str2=new StringTokenizer(str1); 
     int i=0; 
     String d[]=null; 
     while(str2.hasMoreTokens()) 
     { 
      d[i]=str2.nextToken(); 

     } 
    System.out.println(d); 
    } 
} 
+4

'字符串d [] = NULL;'为什么做呢? (然后,当你写'd [i] .something'就像写'null.something'这会导致NPE)。 – Maroun

回答

3

数组必须初始化。这个:

String d[] = null; 

本质上创建一个对数组的引用,它是null。因此NullPointerException

更重要的是,即使它被初始化,大小为固定和阵列不能调整大小。你可以这样做:

String[] d = new String[]; // won't compile: size not specified 

继续,你这样做:

d[i] = "whatever"; 

i总是0

使用List<String>代替:

List<String> list = new ArrayList<>(); 

.add(theString)它:

while (str2.hasMoreTokens()) 
    list.add(str2.nextToken()); 

最后但并非最不重要的,这样的:

System.out.println(d); 

不会做你认为它。它将打印该数组引用的字符串表示。如果你想在阵列加上其元素的字符串表示,这样做:

System.out.println(Arrays.toString(d)); 
1

试图填充null阵列是不可接受的:

String d[]=null; 

将其更改为String[] d = new String[20];,但这里是另外一个问题,你不知道你有多少令牌获得,所以使用动态列表(例如ArrayList)会更好。在Java中

+0

主席先生,我认为我们可以将null赋值给一个引用变量,那么我们可以给它赋值.. –

+0

@TusharPaliwal如果给数组赋值null,那么在内存中将没有空间分配给数组。那么如何将值分配给未分配数组的条目呢?你根本不能。 – Juvanis

+0

不适用于阵列,不能 – fge

0

您定义d[]null,然后访问元素i。这是造成NullPointerException

你应该做的是初始化d[]大到足以让所有的标记适合,例如String d[] = new String[100]

哦,不要忘了你的递增计数器i

而不是使用数组,可以考虑使用List<String>,因为它会动态地增加,所以你将不必挑选一个初始大小必须足够大,你的所有数据,以适应在。

1

更好的使用列出你的情况,因为你不知道标记器返回多少个元素。

public static void main(String str[]) 
{ 
    String str1="This is my first page"; 
    StringTokenizer str2=new StringTokenizer(str1); 
    int i=0; 
    List<String> d=new ArrayList<String>(); 
    while(str2.hasMoreTokens()) 
    { 
     d.add(str2.nextToken()); 

    } 
    System.out.println(d); 
} 
0
+0

虽然此链接可能回答此问题,但最好在此处包含答案的重要部分并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 –

+1

@HinataHyuga感谢您的推荐。我会为我的下列答案做这件事。 – newuser

4

你应该算令牌和初始化使用基于该字符串数组str2.countTokens()

和印刷应该在循环里做...

public static void main(String str[]) { 
    String str1 = "This is my first page"; 
    StringTokenizer str2 = new StringTokenizer(str1); 
    int i = 0; 
    String d[] = new String[str2.countTokens()]; 
    while (str2.hasMoreTokens()) { 
     d[i] = str2.nextToken(); 
     System.out.println(d[i]); 
    } 
} 
1

使用令牌计数进行数组初始化:

String d[]=new String[str2.countTokens()]; 
1

StringTokenizer是一个遗留类,由于兼容性原因而被保留,尽管它在新代码中的使用不受欢迎。建议任何寻求此功能的人使用String或java.util.regex包的拆分方法。

下面的示例示出了如何String.split方法可用于将一个字符串分解成它的基本标记:

 String[] result = "this is a test".split("\\s"); 
    for (int x=0; x<result.length; x++) 
     System.out.println(result[x]);