0

我正在编写一个算法来建立一个无向的对象图。在向图中的特定元素正确添加和删除边之后,我到达了某个点,我得到了这个错误。

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。为什么会这样?

4

1 回答 1

2

您在这里没有说 mGraph 是如何填充的。如果任何条目是不可修改的集合——特别是如果这些是其他一些数据结构的视图——那么它可能会导致该错误消息。令许多开发人员懊恼的是,Java 集合类上的许多操作都是可选的,甚至可能不支持实现者。Collections.unmodifiableCollection 返回只读视图,该方法通常用于其他集合的视图(例如 Map.keySet)。

为确保仅将 HashSet 实例放入 mGraph,请从源集中显式创建new HashSet<Object>andaddAll或使用new HashSet<Object>(existingSet)构造函数。

于 2015-07-07T21:34:13.093 回答