java - 如何修复致命异常 : java. lang.IndexOutOfBoundsException 索引 : 0, 大小:1

标签 java android multithreading kotlin arraylist

Kotlin 程序 fragment :

fun peek() = if (!elements.isEmpty() && elements.size > 0) elements[0] else null

效果很好,但有时我会收到 firebase 崩溃报告:

Fatal Exception: java.lang.IndexOutOfBoundsException Index: 0, Size: 1 java.util.ArrayList.get (ArrayList.java:437) bigmick.ghu.util.Queue.peek (Queue.kt:17)

对我来说这听起来很疯狂:列表的大小为 1,而且第一个(现有的)元素可以通过 index=0 引用。

据我所知,它应该可以工作。但有时它不会。

最佳答案

ArrayList 类不是线程安全的。当一个线程在另一个线程调用您的方法的同时进行更改时,可能会发生意想不到且看似不可能的事情。

一个可能的修复是让两个线程不可能同时调用列表的方法(“互斥”)。这很容易通过 Collections.synchronizedList 实现

elements = Collections.synchronizedList(new ArrayList<>())

如果您从列表中读取的元素比写入的要多得多,另一种方法是使用 CopyOnWriteArrayList而不是 ArrayList

我看到您正在使用名为队列的类中的这段代码。在那种情况下,您可能希望使用实际的队列数据结构而不是列表,并且标准库有许多选项可供您选择,具体取决于您想要的行为。例如,请参阅此问题 Choosing the best concurrency list in Java

关于java - 如何修复致命异常 : java. lang.IndexOutOfBoundsException 索引 : 0, 大小:1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338223/

相关文章:

android - Robolectric 间歇性 NPE 在 org.robolectric.res.ResBundle$Value.compareTo(ResBundle.java :189)

java - 在单独线程上处理请求后写入非阻塞 NIO UDP (DatagramChannel) 套接字

java - java进程中处于等待状态的线程对内存的影响

c# - WPF多线程进度对话框

java - aar 中不包含的类

java - 为什么我无法在 Eclipse Luna Service Release 1 (4.4.1) 中使用 Java 8?

java - 从命令提示符编译 java 应用程序时出错

Android:尝试使用数据绑定(bind)设置 CardView 的布局权重

java.lang.RuntimeException : Unable to start activity ComponentInfo{ java. lang.ClassCastException : android. widget.LinearLayout

android - Ontouch() 不适用于自定义 View ?