排除IndexOutOfBoundsException

时间:2015-05-26 05:52:53

标签: java arraylist indexoutofboundsexception

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

导致错误的行是

pamObservers.get(i);

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

IndexOutOfBoundsException: Index: 3, Size: 4

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

我不知道如何解决这个问题,因为它似乎应该有效。错误是随机的 - 有时我必须在文本框发生之前更改4或5次。任何建议都会受到赞赏,因为我已经在圈子里跑了将近2个小时而且我不知道该怎么做。非常感谢。

1 个答案:

答案 0 :(得分:1)

这里的东西非常腥,但我的直觉告诉我,你收集的条件并不总是如此。

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

调试时的一些提示:

  • 对行为提出假设。如果你可以假设这种行为,它会比抓住吸管更有成效。
    • 当前的工作假设: pamObservers在某种程度上是我们不知道的变异。
  • 证明您的假设。在某些条件下运行类似步骤调试的测试。
    • 测试用例:使用条件断点,当i等于或大于集合的大小时,该断点将停止执行。
  • 验证您的结果。查看您对代码行为的假设是否导致您获得了一个好的解决方案,如果没有,请重复这些步骤,直到您缩小行为范围为止