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()
只是一个返回整数的吸气剂。
答案 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次列表操作(size
和get
)需要作为原子操作执行。)
您表示怀疑:
我不知道。从理论上讲,它可以更改,但是如果在两天之内并且两次评估之间的时间里两次用户之间都发生了更改,则似乎极不可能。
非常不可能发生的事件。
您关于“极不可能”的直觉可能是错误的(基于证据!)。除非您进行了彻底的数学分析(或大量测量),否则您实际上无法量化“极不可能”的可能性。
概率可能会受到使用软件的方式,平台行为的差异/变化等的影响。
您是否有证据支持的替代解释?
有经验的程序员(并发)会认识到这是一个潜在原因,并且无论他/她有多大的直觉,都应予以解决。