繁体   English   中英

从Arraylist中删除第0个元素时出现IndexOutOfBoundsException

[英]IndexOutOfBoundsException when removing 0th element from Arraylist

我已使用ArrayList存储(作为队列)通过BLE接收的数据。 而且我使用相同的ArrayList将数据传递给Bufferedwriter。 每次我通过调用.isempty()方法验证ArrayList .isempty()空之后,调用.remove(0)方法来获取第一个元素。 请在下面找到代码示例。

while (!ppgHighQueue.isEmpty()) {
    try {
        PPG ppg_record = ppgHighQueue.remove(0);
        if (ppg_record != null) {
            ppg_400Hz_record.write(ppg_record.toString());
            ppg_400Hz_record.flush();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是从这一点来看,很少会出现以下异常并导致应用崩溃。

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

还有其他可行的方法来存储数据而不是使用ArrayList吗?

您的代码不是线程安全的。 如果从多个线程访问ppgHighQueue则可以在isEmpty()remove(0)调用之间进行修改。

您应该考虑同步ppgHighQueue访问。

简化示例:

class SomeWorker {


    ArrayList ppgHighQueue;
    Object lock = new Object();

    void remover() {
        while (!ppgHighQueue.isEmpty()) {
            synchronized (lock) {
                try {
                    if (ppgHighQueue.isEmpty()) continue; // this check after lock is needed
                    PPG ppg_record = ppgHighQueue.remove(0);
                    if (ppg_record != null) {
                        ppg_400Hz_record.write(ppg_record.toString());
                        ppg_400Hz_record.flush();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    void otherAccess() {
        synchronized (lock) {
            if (!ppgHighQueue.isEmpty()) {
                ppgHighQueue.remove(0);
            }
        }
    }
}

这第二个isEmpty检查可确保获取锁后您的列表不为空。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM