【问题标题】:tips for troubleshooting IndexOutOfBoundsExceptionIndexOutOfBoundsException 故障排除提示
【发布时间】:2015-05-26 05:52:52
【问题描述】:

我正在开发一个小模块,作为一个非常大的开源项目的一部分。整个程序录制音频,用户可以选择实时运行分析的各种模块。我的模块有几个文本框,允许用户跟踪操作参数。有时,当同时加载大量模块并对数据进行操作时,更改其中一个文本框会导致程序在尝试提醒我的模块有新数据时出现阻塞。

导致错误的行是

pamObservers.get(i);

pamObservers 是一个大小为 4 的 ArrayList,我的模块在索引 3 中。发生错误时 i=3。错误信息是

IndexOutOfBoundsException: Index: 3, Size: 4

我正在使用 Eclipse IDE,并且我为该异常添加了一个断点,因此它会立即停止。我在变量视图中查看 pamObservers,我可以看到我的模块在那里 - 索引位置不是 null 或任何东西。我可以在 Expressions 视图中键入该行,它会返回我的模块的名称。

我不知道如何解决这个问题,因为它似乎应该可以工作。错误是随机的 - 有时我必须在它发生之前更改文本框 4 或 5 次。任何建议将不胜感激,因为我已经绕圈跑了将近 2 个小时,我只是不知道该怎么做。非常感谢。

【问题讨论】:

  • 你需要检查 pamObservers 是否为空。使用前
  • 请向我们展示您的其余代码
  • 通常不可能获得索引小于大小的 IOOBE。 ArrayList中对应的代码是rangeCheck方法:if (index >= size) throw new ...。所以我只能假设线程问题。这也将符合您偶尔收到错误的观察结果。您的问题缺少一些代码,因此我们无法重现您的问题。请创建并发布MCVE
  • 这非常奇特。
  • 我很抱歉没有包含代码。我给出的那行只是一个简短的 for 循环的一部分,从 0 到 pamObservers.size()。至于重现错误,我认为如果不运行整个程序就无法重现它。线程问题似乎是一种确定的可能性 - 调试视图将其显示为 41 个线程中的第 13 个线程,我不知道其他线程中发生了什么。我根本没有太多使用线程,所以如果这是问题所在,那么我真的有麻烦了......

标签: java arraylist indexoutofboundsexception


【解决方案1】:

这里有些东西很可疑,但我的直觉告诉我,你收藏的条件并不总是正确的。

考虑设置一个conditional breakpoint,这样i >= pamObservers.size()。这样,Eclipse 只会在pamObservers.get(i) 导致异常时停止调试器,并且您可以正确检查代码的状态。

调试时的一些提示:

  • 对行为提出假设。如果您可以对行为进行假设,那将比抓住稻草更有成效。
    • 当前的工作假设:pamObservers 正在以某种我们不知道的方式发生变异。
  • 证明你的假设。 在特定条件下运行测试,例如分步调试。
    • 测试用例:使用条件断点,当i 等于或大于集合的大小时将停止执行。
  • 验证你的结果。看看你对代码行为的假设是否能引导你找到一个好的解决方案,如果没有,重复这些步骤,直到你缩小行为的范围。李>

【讨论】:

  • 谢谢 - 我不知道条件断点。你的建议真的很好。我会看看是否可以缩小范围。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2010-11-30
  • 2021-09-11
  • 2012-02-18
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多