我正在编写一个算法来设置对象的无向图。在正确地向图表中的特定元素添加和删除边缘后,我到达了某个点,我得到了这个错误。
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
at UndirectedGraph.addEdge(UndirectedGraph.java:81)
请注意,这是在程序已经允许我向图表添加边缘之后,并且我将对象输入addEdge方法的方式没有任何改变。 addEdge的代码是:
private final Map<Object, Set<Object>> mGraph = new HashMap<Object, Set<Object>>();
public void addEdge(Object one, Object two) {
/* Confirm both endpoints exist. */
if (!mGraph.containsKey(one) || !mGraph.containsKey(two))
throw new NoSuchElementException("Both nodes must be in the graph.");
/* Add the edge in both directions. */
mGraph.get(one).add(two);
mGraph.get(two).add(one);
}
在运行调试器时,我发现在调用mGraph.get(one)时代码的开头会返回一个HashSet,但是当错误发生时它会返回Collections $ UnmodifiableSet。为什么会这样?
答案 0 :(得分:2)
你不会在这里说mGraph是如何填充的。如果任何条目是不可修改的集合 - 特别是如果它们是某些其他数据结构的视图 - 那么它可能会导致该错误消息。令许多开发人员感到懊恼的是,Java集合类上的许多操作都是可选的,甚至对于实现者也可能不支持。 Collections.unmodifiableCollection返回只读视图,该方法通常用于其他集合的视图(例如Map.keySet)。
要确保只将HashSet实例放入mGraph,请从源集中显式创建new HashSet<Object>
和addAll
,或使用new HashSet<Object>(existingSet)
构造函数。