我正在使用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中的数组元素?我该怎么做才能解决这个问题?感谢您的见解。
答案 0 :(得分: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 friendly :)
答案 1 :(得分:0)
你能试试下面的代码吗?我只是在for循环中添加- 1
。
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);
}
}