我试图查看字符串中的下一个标记是否等同于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)
答案 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);
因此,修改后的代码将如下:
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();
}