別のスレッドで常に追加および削除している Arraylist があります。1 つのスレッドが追加され、もう 1 つのスレッドが削除されます。
これは、変更リストを含むクラスです。
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)
です。コードのコメントからわかるように、ある時点でセマフォを使用しようとしましたが、それでも断続的に nullpointer 例外がスローされたため、独自のタイプのスリープ ポールを半概念実証として作成しました。
null ポインター例外が発生する理由や修正方法がわかりません。