NoSuchElementException错误

时间:2014-09-17 04:31:02

标签: java runtimeexception stringtokenizer nosuchelementexception

我试图查看字符串中的下一个标记是否等同于map键,并将消息添加到数组列表中。

ArrayList<String> trace = new ArrayList<String>();
if(!element.startsWith("PRINT")) {
            while(st.hasMoreTokens()) {
                tokens.add(st.nextToken());
            }

            for(String key: expression.keySet())
                if(st.nextToken() == key)
                    trace.add(key + "Changed from " + expression.get(key) + " to " + tokens.get(2));

            expression.put(tokens.get(0),Integer.parseInt(tokens.get(2)));
            tokens.clear();
}

错误消息

    Exception in thread "main" java.util.NoSuchElementException
    at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
    at Commander.main(Commander.java:45)

1 个答案:

答案 0 :(得分:3)

问题出在st.nextToken()电话上。

您只检查st.hasMoreTokens()一次,但两次致电st.nextToken()。它正在抛出错误。

在第一个while循环中,您正在阅读所有令牌:

while(st.hasMoreTokens()) {
    tokens.add(st.nextToken());
}

因为&#39;所有&#39;已经读取了令牌,现在当您尝试在for循环内再次读取令牌时,您将收到错误。

if(st.nextToken() == key) {
    trace.add(key + "Changed from " + expression.get(key) + " to " + tokens.get(2));
}

还有另一个潜在的问题。您正在尝试将第3个令牌转换为整数。它也可能在那里失败:

// Value of tokens.get(2) is "string"
Integer.parseInt(tokens.get(2))

你也会在这里得到错误。最好检查tokens.get(2)是否是数字类型。像:

int value = 0;
if (StringUtils.isNumeric(tokens.get(2))) {
    value = Integer.parseInt(tokens.get(2));
}
// Default value will be 0.
expression.put(tokens.get(0), value);

参考:StringUtils.isNumeric()

因此,修改后的代码将如下:

ArrayList<String> trace = new ArrayList<String>();
if(!element.startsWith("PRINT")) {
    List<String> tokens = new ArrayList<String>();
    while(st.hasMoreTokens()) {
        tokens.add(st.nextToken());
    }

    // Size of tokens has to be more then 3, otherwise you will get another error.
    if (tokens.size() >= 3) {
        for(String key: expression.keySet()) {
            if(tokens.get(0).equals(key)) {
                 // Do your other operations...
                 trace.add(key + "Changed from " + expression.get(key) + " to " + tokens.get(2));
            }
        }

        // Do some more operations ...
        int value = 0;
        if (StringUtils.isNumeric(tokens.get(2))) {
            value = Integer.parseInt(tokens.get(2));
        }
        // Default value will be 0.
        expression.put(tokens.get(0), value);
    }
    tokens.clear();
}