【问题标题】:IndexOutOfBoundsException when removing 0th element from Arraylist从 Arraylist 中删除第 0 个元素时出现 IndexOutOfBoundsException
【发布时间】:2018-08-23 11:09:43
【问题描述】:

我使用 ArrayList 来存储(作为队列)通过 BLE 接收的数据。我使用相同的 ArrayList 将数据传递给 Bufferedwriter。每次我通过调用.isempty() 方法验证 ArrayList 非空后调用.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 吗?

【问题讨论】:

  • java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 这意味着您正在调用空列表的第一个元素。无论您使用地图、数组、列表还是其他类型的集合,问题总是相似的
  • 而这段代码是从哪里调用的?因为它不是线程安全的。
  • 您是否在多个线程中运行此代码?
  • 你用multithreading标记了这个,所以这是从多个线程调用的?如果是这样,可能是两个线程进入循环,一个删除一个元素,第二个线程抛出异常,因为列表为空。
  • @dhke 此方法在单独的线程中运行。这是否意味着我需要同步线程。

标签: java android multithreading arraylist


【解决方案1】:

您的代码不是线程安全的。如果从多个线程访问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 检查确保您的列表在获得锁定后不为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 2014-06-03
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多