我遇到了问题,我正在使用一个拥有超过一百万行数字的文本文件。数据格式如下,有些行有3个数据,有些则只有2个。 每次文件只用2位获取数据时,它似乎抛出一个空错误(我正在使用Try / catch来读取输入流)
如果删除值3 tokenizer,程序将运行到最后。 我是否需要输入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
答案 0 :(得分:5)
您必须检查令牌化程序中是否还有令牌。你可以这样做:
String Value3 = tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null;
如果没有第三个令牌,会将Value3
设置为null
。您可能希望将其设置为空字符串。
另一种方法是使用getLine.split("\\s+")
,它将返回一个令牌数组。如果只有2个值,则数组的长度为2.因此,在尝试读取可能不存在的第3个值时要小心。
答案 1 :(得分:0)
如果您尝试第三次调用nextToken
,则当没有令牌存在时,它将返回null。最好的办法是使用String.split
,您可以在其中检查令牌的数量。 StringTokenizer
无论如何都是遗产。
String[] tokens = getLine.split("\\s+");
答案 2 :(得分:0)
那么,使用像这样的try catch块怎么样??
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);
如果没有读取任何令牌,你将获得一个空的“值”。