是否有一种方法可以打印出谁在Iterator.next()
上的ConcurrentModificationException
时修改ArrayList
?
如果仅用于调试和暂时的故障拍摄,我可以建议使用动态java.lang.reflect.Proxy
。如果您控制ArrayList
的创建,这将起作用。使用代理您也可以拦截迭代器创建一个为其创建代理。
基本上,在每种方法之前和之后,添加登录代理截距。然后,您可以分析日志以查看方法的流动流量。要了解如何创建代理,有很多很棒的博客和示例,但是我建议您从Oracle Docs的Java Reflection指南开始。有一个与您需要的相似的例子。
hth。
更新:当然,代理只能与接口一起使用,即仅当您不严格地参考代码中的ArrayList
(除了实例化之外)。否则,您需要对代码进行重构以在声明中使用List
,而不是ArrayList
...
来自Javadoc的ArrayList
(我的重点):
该类的迭代器返回的迭代器和ListIterator方法是失败的:如果列表在创建迭代器后的任何时间进行结构修改,则以任何方式,除非通过迭代器自己的删除或添加 <<strong> <<strong> 迭代器将投掷consurrentModificationException 。
因此,访问迭代器会引发异常,而不是修改线程。您可能不会在发生时发现修改,并且CME仅在尝试通过现有迭代器提出值或获取值时才发生。
如果您必须检测修改操作,则可能必须包装实现。