字符串数组中的空指针异常,在初始化期间指定null

时间:2013-07-22 06:50:52

标签: java string

我是java的初学者。现在我在实践中遇到问题。实际上我想从StringTokenizer类中获取String标记,并希望将这些标记分配给string的数组。但是我得到空指针异常。我代码在这里。

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);
    }
}

8 个答案:

答案 0 :(得分: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 :(得分:3)

必须初始化Java中的数组。这样:

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

答案 2 :(得分:1)

尝试填充null数组是不可接受的:

String d[]=null;

将其更改为String[] d = new String[20];,但这是另一个问题,您不知道将获得多少令牌,因此使用动态列表(例如ArrayList)将更精细。

答案 3 :(得分:1)

最好在你的情况下使用List,因为你不知道tokenizer返回了多少个元素。

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);
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String的split方法或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]);

答案 6 :(得分:0)

您将d[]定义为null,然后访问元素i。这导致NullPointerException

您应该做的是初始化d[]以使所有令牌适合,例如String d[] = new String[100]

哦,不要忘记增加你的计数器i

不要使用数组,而是考虑使用List<String>,因为它会动态增加,因此您不必选择足够大的初始大小来容纳所有数据。

答案 7 :(得分:0)

试试这个 Array initialization