gpt4 book ai didi

java - 为什么 Java Set 上的 ConcurrentModificationException 会转储有关 Map 迭代器的堆栈跟踪?

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:25 25 4
gpt4 key购买 nike

如果我同时修改 Java Set,我将收到 ConcurrentModificationException。问题在于堆栈跟踪表明在某个 Map 迭代器上遇到了修改。我现在明白 Maps 用于在 java 中实现 Sets,但这些细节是实现的内部细节。我相信内部 Map 迭代器异常应该已正确包装在应已传回的 Set Iterator 相关异常中。

我说得有道理还是我错过了什么?我只是花了两天时间试图在代码中找到不存在的错误 Map 操作,最终却偶然发现(通过反复试验放大,而不是通过逻辑过程或文档)导致问题的 Set 操作。我想知道将来如何才能避免这样的挫折。

------------更新--------------我的问题不是关于如何获得正确的并发性。我的问题是如何避免被这种无用的堆栈跟踪消息误导。 Map Iterator 异常不会出现在堆栈跟踪中,而不是实际的 SetIterator 异常,这从用户的角度来看是有意义的

最佳答案

虽然表面上看起来有点奇怪,但当您遇到这样的错误时,堆栈跟踪应该为您提供所需的信息 - 忽略 java.util 内部的跟踪的前几行,并查找对您自己的类之一的第一个引用。该行将是调试时开始查找的地方。

至于为什么 HashSet 上的迭代器看起来是与映射相关的类型,而不是与集合相关的类型,这是因为它是 - HashSet.iterator 的实现只是返回 backingMap.keySet().iterator()。不存在这样的“SetIterator”。

关于java - 为什么 Java Set 上的 ConcurrentModificationException 会转储有关 Map 迭代器的堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15062277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com