gpt4 book ai didi

java.lang.ArrayIndexOutOfBoundsException 当它不应该发生时

转载 作者:行者123 更新时间:2023-12-01 19:41:46 26 4
gpt4 key购买 nike

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

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1

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

这是可能导致此问题的行:

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

这种崩溃不是不可能发生的吗?getDuration() 只是一个返回整数的 getter。

最佳答案

Shouldn't that crash be impossible?

如果有另一个线程修改ArrayList也不是不可能。

例如:

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

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

  • 所有操作都应该使用同步或其他一些锁定来确保线程安全,或者
  • 数组列表应替换为并发数据结构。
<小时/>

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

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

<小时/>

您表示怀疑:

I don't know. It can change theoretically but if it happened to two users in two days and within the time between those evaluations, it just seems extremely unlikely.

  1. 极不可能的事件确实会发生。

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

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

  4. 您有其他有证据支持的解释吗?

  5. 经验丰富的程序员(并发)会将此视为潜在原因,并无论如何修复它,而不管他/她的直觉感觉如何。

关于java.lang.ArrayIndexOutOfBoundsException 当它不应该发生时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55151999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com