3

我是java的初学者。现在我在实践中遇到问题。实际上我想从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

8 回答 8

4

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

String d[] = null;

本质上创建一个对数组的引用,该数组为空。因此NullPointerException.

更重要的是,即使初始化了,大小也是固定的,数组不能resize。你不能这样做:

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

继续,你做:

d[i] = "whatever";

并且i始终为 0。

使用 aList<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));
于 2013-07-22T06:53:56.270 回答
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]);
    }
}
于 2013-07-22T06:57:24.913 回答
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]);
于 2013-07-22T07:07:51.930 回答
1

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

String d[]=new String[str2.countTokens()];
于 2013-07-22T06:59:28.500 回答
1

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

String d[]=null;

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

于 2013-07-22T06:52:18.660 回答
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);
}
于 2013-07-22T06:55:09.287 回答
0

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

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

哦,别忘了增加你的计数器i

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

于 2013-07-22T06:54:05.900 回答
0

试试这个进行 数组初始化

于 2013-07-22T06:55:12.763 回答