作为超大型开源项目的一部分,我正在研究一个小模块。整个程序记录音频,用户可以选择实时运行分析的各种模块。我的模块有几个文本框,允许用户跟踪操作参数。有时,当加载了许多模块并同时对数据进行操作时,更改我的一个文本框会导致该程序在试图警告我的模块有新数据时被阻塞。

导致错误的行是

pamObservers.get(i);


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

IndexOutOfBoundsException: Index: 3, Size: 4


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

我不知道如何解决此问题,因为它似乎应该可以工作。该错误是随机的-有时我必须将文本框更改4到5次才能发生。任何建议将不胜感激,因为我已经圈了差不多两个小时,而且我只是不知道该怎么办。非常感谢。

最佳答案

这里有些鱼腥味,但是我的直觉告诉我,您收藏的条件并不总是正确的。

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

像这样调试时的一些技巧:


对行为提出一个假设。如果可以对这种行为进行假设,那将比紧抓稻草更有效率。


当前的工作假设:pamObservers以某种我们不知道的方式发生了变异。

证明你的假设。在某些条件下运行测试,如逐步调试。


测试案例:使用条件断点,当i等于或大于集合的大小时,该断点将停止执行。

验证结果。看看您对代码中行为的假设是否使您找到了一个好的解决方案,如果没有,请重复这些步骤,直到缩小行为范围。

09-11 19:16