1

別のスレッドで常に追加および削除している 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 ポインター例外が発生する理由や修正方法がわかりません。

4

2 に答える 2