有没有办法打印ArrayList
ConcurrentModificationException
上Iterator.next()
时修改public class MainActivity extends AppCompatActivity {
Toolbar toolbar;
TabLayout tabLayout;
ViewPager viewPager;
ViewPagerAdapter viewPagerAdapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolBar);
setSupportActionBar(toolbar);
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPagerAdapter.addFragments(new A(), "A");
viewPagerAdapter.addFragments(new B(), "B");
viewPagerAdapter.addFragments(new C(), "C");
viewPager.setAdapter(viewPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
}
}
的人?
答案 0 :(得分:1)
如果仅用于调试和临时故障排除,我建议使用动态java.lang.reflect.Proxy
。如果您控制ArrayList
的创建,这将有效。使用代理可以拦截迭代器创建,也可以为它创建代理。
基本上,在代理拦截的每个方法之前和之后添加日志记录。然后,您可以分析日志以查看方法调用的流程。 要了解如何创建代理,有很多很棒的博客和示例,但我建议您从Java Reflection Guide at Oracle Docs开始。有一个例子与你需要的非常相似。
HTH。
更新:当然代理只能用于接口,即只有在代码中没有严格引用ArrayList
时才会使用代理(除了实例化它)。否则,您需要重构代码才能在声明中使用List
而不是ArrayList
...
答案 1 :(得分:0)
来自ArrayList
的Javadoc(我的重点):
此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外, < em>迭代器将抛出ConcurrentModificationException 。
因此,访问迭代器会抛出异常,而不是修改线程。您可能无法在发生修改时发现修改,只有当您尝试通过现有迭代器提前或获取值时才会发生CME。
如果必须检测修改操作,则可能需要包装实现。