不应该发生的java.lang.ArrayIndexOutOfBoundsException

时间:2019-03-13 22:17:50

标签: java

Crashlytics和Google Play控制台都报告了我的至少两个用户的崩溃。

  

致命异常:java.lang.ArrayIndexOutOfBoundsException:length = 10;索引= -1

     

在java.util.ArrayList.get(ArrayList.java:413)

以下是引起它的那一行:

if (savedState.userEntries.size() > 0 && savedState.userEntries.get(savedState.userEntries.size()-1).getDuration()==0)

那崩溃不是不可能的吗? getDuration()只是一个返回整数的吸气剂。

1 个答案:

答案 0 :(得分:4)

  

那崩溃不是不可能的吗?

如果有另一个线程修改ArrayList,这并非不可能。

例如:

if (
    (savedState.userEntries.size()>0) && 
    // Another thread empties the list NOW
    (savedState.userEntries.get(savedState.userEntries.size()-1).getDuration()==0)
) {

如果可以从多个线程中访问和修改这些数据结构,则可以选择:

  • 它应使用synchronized或所有其他锁定来确保线程安全的所有操作,或
  • 数组列表应替换为并发数据结构。

您需要根据对当前数据结构使用方式的总体评估来选择方法。例如,您可能希望将其替换为Queue

(某些潜在的解决方案不起作用;例如,用ArrayList替换synchronizedList(list)在这里行不通,因为您在此处进行了2次列表操作(sizeget )需要作为原子操作执行。)


您表示怀疑:

  

我不知道。从理论上讲,它可以更改,但是如果在两天之内并且两次评估之间的时间里两次用户之间都发生了更改,则似乎极不可能。

  1. 非常不可能发生的事件。

  2. 您关于“极不可能”的直觉可能是错误的(基于证据!)。除非您进行了彻底的数学分析(或大量测量),否则您实际上无法量化“极不可能”的可能性。

  3. 概率可能会受到使用软件的方式,平台行为的差异/变化等的影响。

  4. 您是否有证据支持的替代解释?

  5. 有经验的程序员(并发)会认识到这是一个潜在原因,并且无论他/她有多大的直觉,都应予以解决。