-1

我正在尝试查看字符串中的下一个标记是否等效于映射键,并将消息添加到数组列表中。

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)
4

1 回答 1

3

问题在于st.nextToken()通话。

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

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

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

由于已经读取了“所有”令牌,现在当您尝试在for循环内再次读取令牌时,您将收到错误消息。

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

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

// 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();
}
于 2014-09-17T04:33:44.057 回答