我遇到了问题,我正在使用一个包含超过一百万行数字的文本文件。 数据采用以下格式,有些行有 3 条数据,而另一些行只有 2 条数据。每次文件仅以 2 位到达数据时,它似乎都会抛出一个空错误(我正在使用 Try/catch 来读取输入流)
如果我删除值 3 分词器,那么程序将运行到最后。我是否需要放置一个 if 语句来检查第二行之后是否有另一个标记?如果是这样 - 如何??
while ((getLine = br.readLine()) != null) {
StringTokenizer tokenizer = new StringTokenizer(getLine);
String Value1 = tokenizer.nextToken();
String Value2 = tokenizer.nextToken();
String Value3 = tokenizer.nextToken();
//Does some more things
}
数据
11 22 33
44 55
77 88 99
10 11
13 14
16 17 18
您必须检查分词器中是否仍有标记。你可以这样做:
String Value3 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
如果没有第 3 个令牌,这会将Value3
设置为 null
。您可能希望将其设置为空字符串。
另一种方法是使用 getLine.split("\s+")
,这将返回一个令牌数组。如果只有 2 个值,则数组的长度为 2。因此,在尝试读取第 3 个值时要小心,该值可能不存在。
如果第三次尝试调用nextToken
,当不存在令牌时,它将返回 null。更好的办法是使用 String.split
,您可以在其中检查令牌的数量。 无论如何,StringTokenizer
都是遗产。
String[] tokens = getLine.split("\s+");
好吧,使用这样的尝试捕获块怎么样..?
String Value1 = null, Value2 = null, Value3 = null;
try {
Value1 = null;
Value2 = null;
Value3 = null;
Value1 = tokenizer.nextToken();
Value2 = tokenizer.nextToken();
Value3 = tokenizer.nextToken();
} catch (NoSuchElementException nse) {
// Do Nothing. Just continue..
}
// Does some more things
System.out.println(Value1 + Value2 + Value3);
如果未读取任何令牌,则将具有空"值"。