-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()は 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();
}
于 2014-09-17T04:33:44.057 に答える