問題はst.nextToken()
通話です。
確認st.hasMoreTokens()
は 1 回だけですが、呼び出しはst.nextToken()
2 回行われています。そして、それはエラーを投げています。
最初のループ中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));
}
別の潜在的な問題もあります。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();
}