首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringTokenizer "NoSuchelementException“

StringTokenizer "NoSuchelementException“
EN

Stack Overflow用户
提问于 2016-03-26 20:38:09
回答 3查看 4.3K关注 0票数 2

因此,出于某种原因,我得到了一个java.lang.Exception: java.util.NoSuchElementException。这些值就像这样一分为二。

代码语言:javascript
复制
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

但在最后,我得到了NoSuchelementException:

我的代码很简单:

代码语言:javascript
复制
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);
    }

我似乎不知道为什么这些元素会打印出来,但我最终会得到一个noSuchelementException。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-26 20:45:36

问题是每次迭代都要调用hasMoreElements()一次,但是要调用nextElement/nextToken三次。这很容易出错。即使文件遵循精确的格式,例如在您的情况下,也有可能在末尾有一个空行。

看起来,这正是在您的情况下所发生的事情:当您询问令牌程序是否有更多的元素时,您将得到true,但是只有一个元素,它恰好是一个新的行字符。对nextElement的第一次调用成功,但第二次调用失败。

要解决此问题,请在每次调用hasMoreElements()之前添加nextElement检查,如果没有下一个元素,则退出:

代码语言:javascript
复制
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());
票数 2
EN

Stack Overflow用户

发布于 2016-03-26 20:44:29

您只调用了两次line.nextElement(),而只检查了一次line.hasMoreElements()。会不会是在最后只剩下一个元素,而不是两个?

票数 1
EN

Stack Overflow用户

发布于 2016-03-26 20:52:10

在循环的每一次迭代中,测试一次是否还有可用的令牌,然后尝试从令牌程序中绘制三个令牌。如果所有三个标记都已成功绘制,则可以打印结果,但只能确信其中一个已成功绘制。如果原始字符串中的令牌总数不是三个的倍数,那么您肯定会得到一个NoSuchElementException。如果您认为您的数据看起来与您预期的不一样,那么这可能是由于您的原始字符串中的尾随空格(最后产生了一个意外的空令牌)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36240614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档