所以我有一个列表集合,其中包含来自流式传感器的数据。然后我做了一个 for 循环将其形成为稍后我将用来发送到其他地方(网络服务器)的格式。但有时列表的大小会相差 1 或 2。当这种情况发生时,代码将抛出越界异常。
这是我用来组装格式的代码,
for (int i = 0; i < acceleroElaps.size(); i++) {
HashMap data = new HashMap();
data.put("person", "Adi");
data.put("tool", "Accelerometer");
data.put("time", acceleroTime.get(i));
data.put("elapsed", acceleroElaps.get(i));
data.put("xaxis", acceleroXval.get(i));
data.put("yaxis", acceleroYval.get(i));
data.put("zaxis", acceleroZval.get(i));
accelData.add(data);
}
但有时其中一个列表的大小不同。我尝试用这样的迭代器迭代它
ListIterator<String> iterAT = acceleroTime.listIterator();
ListIterator<String> iterAE = acceleroElaps.listIterator();
ListIterator<String> iterAX = acceleroXval.listIterator();
ListIterator<String> iterAY = acceleroYval.listIterator();
ListIterator<String> iterAZ = acceleroZval.listIterator();
while (iterAT.hasNext() && iterAE.hasNext() && iterAX.hasNext() && iterAY.hasNext() && iterAZ.hasNext()){
String at = iterAT.next();
String ae = iterAE.next();
String ax = iterAX.next();
String ay = iterAY.next();
String az = iterAZ.next();
HashMap data = new HashMap();
data.put("person", "Adi");
data.put("tool", "Accelerometer");
data.put("time", at);
data.put("elapsed", ae);
data.put("xaxis", ax);
data.put("yaxis", ay);
data.put("zaxis", az);
accelData.add(data);
a++;
f++;
}
但它会抛出ConcurrentModificationException。所以我尝试均衡列表的大小,因为它只是有 1 或 2 个数据不同。或者也许还有另一种解决方案,我已经没有主意了
但它会抛出 ConcurrentModificationException。
如果不看到完整的代码,很难判断,但上面提示了可能出现的问题,当集合在迭代过程中更改时会抛出此异常。在您的代码中,没有更改传感器集合,因此可能您的读取线程正在更改它。这也会导致越界异常。
如果您的传感器读取发生在与数据发送不同的线程中,那么您应该确保您的集合更新正确同步。最简单的测试是:
final Object syncObj = new Object();
// in reading thread
synchronized(syncObj) {
// here update your acceleroElaps,... collections
}
// in data send thread
synchronized(syncObj) {
// here prepare data to send to server
}