我有一个 Arraylist,我不断地在单独的线程中添加和删除。一个线程添加,另一个删除。
这是包含更改列表的类:
public class DataReceiver {
private static final String DEBUG_TAG = "DataReceiver";
// Class variables
private volatile ArrayList<Byte> buffer;
//private volatile Semaphore dataAmount;
public DataReceiver() {
this.buffer = new ArrayList<Byte>();
//this.dataAmount = new Semaphore(0, true);
}
// Adds a data sample to the data buffer.
public final void addData(byte[] newData, int bytes) {
int newDataPos = 0;
// While there is still data
while(newDataPos < bytes) {
// Fill data buffer array with new data
buffer.add(newData[newDataPos]);
newDataPos++;
//dataAmount.release();
}
return;
}
public synchronized byte getDataByte() {
/*
try {
dataAmount.acquire();
}
catch(InterruptedException e) {
return 0;
}
*/
while(buffer.size() == 0) {
try {
Thread.sleep(250);
}
catch(Exception e) {
Log.d(DEBUG_TAG, "getDataByte: failed to sleep");
}
}
return buffer.remove(0);
}
}
问题是我在尝试buffer.remove(0)
. 正如您可以从代码中的注释中看出的那样,我曾尝试使用信号量,但它仍然间歇性地抛出空指针异常,因此我创建了自己的睡眠轮询类型作为半概念验证。
我不明白为什么会发生空指针异常和/或如何修复它。