所以出于某种原因,我得到了一个java.lang.Exception:java.util.NoSuchElementException。这些价值就像这样。
back
bison
1.0
back
dog
3.0
becaue
bison
1.0
best
bison
1.0
david
bison
1.0
ever
bison
1.0
i
bison
1.0
i
dog
4.0
im
bison
1.0
is
bison
1.0
但最后我得到No NicelementException:
我的代码很简单:
StringTokenizer line = new StringTokenizer(new String(value.getBytes()));
while (line.hasMoreElements()){
Text unWord = new Text((String) line.nextElement());
String unAuth = (String) line.nextElement();
float unVal = Float.parseFloat(line.nextToken());
System.out.println(unWord);
System.out.println(unAuth);
System.out.println(unVal);
}
我似乎无法弄清楚为什么要打印出这些元素,但最后我会得到一个没有任何错误的异常。
答案 0 :(得分:2)
问题是,每次迭代都会调用hasMoreElements()
一次,但是您会调用nextElement
/ nextToken
三次。这很容易出错。即使文件遵循确切的格式,例如在您的情况下,也有可能在末尾有一个空行。
看起来这正是你的情况正在发生的事情:当你询问tokenizer是否有更多的元素时,你得到true
,但是只有一个元素,恰好是一个新的行字符。第一次调用nextElement
成功,但第二次调用失败。
要解决此问题,请在每次调用hasMoreElements()
之前添加nextElement
检查,如果没有下一个元素则退出:
Text unWord = new Text((String) line.nextElement());
if (!line.hasMoreElements()) break;
String unAuth = (String) line.nextElement();
if (!line.hasMoreElements()) break;
float unVal = Float.parseFloat(line.nextToken());
答案 1 :(得分:1)
您只需拨打line.nextElement()
两次,只需检查line.hasMoreElements()
一次。可能是最后只有一个剩余的元素,而不是两个?
答案 2 :(得分:0)
在循环的每次迭代中,您测试一次是否有更多可用的标记,然后尝试从标记生成器中绘制三个标记。如果成功绘制了所有三个令牌,则打印结果,但您可以确信仅成功绘制了一个。如果原始字符串中的标记总数不是三的倍数,那么您肯定会获得NoSuchElementException
。如果您认为您的数据看起来与您期望的一样,则可能是因为原始字符串中的尾部空格(在最后产生一个意外的空标记)。