我是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);
}
}
答案 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