我正在开发一个小模块,作为一个非常大的开源项目的一部分。整个程序记录音频,用户可以选择实时运行分析的各种模块。我的模块有几个文本框,允许用户跟踪操作参数。有时,当加载许多模块并同时对数据进行操作时,更改我的文本框之一会导致程序在尝试警告我的模块有新数据时卡住。
导致错误的行是
pamObservers.get(i);
pamObservers 是一个大小为 4 的 ArrayList,而我的模块位于索引 3 中。发生错误时 i=3。错误信息是
IndexOutOfBoundsException: Index: 3, Size: 4
我正在使用 Eclipse IDE,并且我已经为该异常添加了一个断点,因此它会立即停止。我在“变量” View 中查看 pamObservers,可以看到我的模块在那里 - 该索引位置不为空或任何内容。我可以在“表达式” View 中键入该行,它会返回我的模块的名称。
我不知道如何解决这个问题,因为它似乎应该有效。该错误是随机的 - 有时我必须更改文本框 4 或 5 次才能发生。任何建议将不胜感激,因为我已经绕圈跑了近两个小时,我只是不知道该怎么办。非常感谢。
最佳答案
这里有些事情很可疑,但我的直觉告诉我,你的 Collection 条件并不总是正确的。
考虑设置 conditional breakpoint这样 i >= pamObservers.size()
。这样,只有当 pamObservers.get(i)
导致异常时,Eclipse 才会真正停止调试器,并且您可以正确检查代码的状态。
像这样调试时的一些技巧:
- 对行为提出假设。如果你能对行为做出假设,这将比捕获救命稻草更有成效。
- 当前工作假设:
pamObservers
正在以某种我们不知道的方式发生变异。
- 当前工作假设:
- 证明您的假设。在某些条件下运行诸如单步调试之类的测试。
- 测试用例:使用条件断点,当
i
等于或大于集合的大小时,该断点将停止执行。
- 测试用例:使用条件断点,当
- 验证您的结果。查看您对代码中的行为所做的假设是否会为您带来良好的解决方案,如果没有,请重复这些步骤,直到缩小行为的范围.
关于java - IndexOutOfBoundsException 故障排除提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30450459/