0

我正在使用 for 循环遍历 ConcurrentHashMap 的键集。但是,有时(不可预测)它会因 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]. 我会尝试将循环中的第一行分成两部分,并在控制台中写入以确认问题出在哪里。就像是。-

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 回答
0

你可以试试下面的代码吗?我只是添加- 1了 for 循环。

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

for (net_count_iterator = 0; net_count_iterator <= net_count - 1; 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);
    }
}
于 2013-09-23T01:56:30.720 回答