0

ConcurrentHashMap のキーセットを反復処理するために for ループを使用しています。ただし、ときどき (予期せず) ArrayIndexOutOfBoundsException でクラッシュします。私が使用しているコードは次のとおりです。

net_keys = MonitorService.net_list.keySet().toArray(net_keys); 
net_count = net_keys.length;

for (net_count_iterator = 0; net_count_iterator < net_count; net_count_iterator++) {
    ap_iterator = MonitorService.net_list.get(net_keys[net_count_iterator]);
    if (ap_iterator.ssid.contains(search_ssid)) {
        aps_temp.add(ap_iterator);
    }
}

net_keys は String[]、ap_iterator は一時オブジェクト、net_count は int、MonitorService.net_list は ConcurrentHashMap です。net_list は、この繰り返しの実行中に別のスレッドによって追加される (ただし、削除されることはない) キーと値のペアを何千も保持する可能性があるため、私の問題は同時実行性に関連している可能性があります。オブジェクトの割り当て (具体的には、ガベージ コレクターがそれらをクリーンアップするのにかかる時間) を回避するために、強化された for ループの使用を特に避けています。専門家への私の質問は次のとおりです: net_keys.length が net_keys の配列要素よりも大きいのはどうしてでしょうか? この問題を修正するにはどうすればよいですか? あなたの洞察に感謝します。

4

2 に答える 2

0

私の推測では、例外はnet_list.getではなくによってスローされnet_keys[net_count_iterator]ます。ループの最初の行を 2 つに分割し、コンソールに書き込み、どこに問題があるかを確認します。何かのようなもの。-

int key = net_keys[net_count_iterator];
System.out.println("*** Got key " + key);
ap_iterator = MonitorService.net_list.get(key);
System.out.println("*** Got iterator " + ap_iterator);

PS:変数名にcamelCaseを使用することを検討してください。よりJava に適しています:)

于 2013-09-23T00:32:38.370 に答える