java - 我自己的图形类中使用 HashMap 的 NPE

标签 java graph nullpointerexception hashmap tostring

这是一个学校项目。我们应该在 HashMap 的帮助下编写一个处理图的程序。每个节点(或角?)都有一个键(这是我们有连接的另一个节点)和一个值(此连接的成本)。我几乎完成了,除了 toString() 方法之外,所有测试用例都有效。应该写成这样:

{(0,1), (2,1)}

这意味着 0 和 1 已连接,2 和 1 也已连接。

/**
 * Returns a string representation of this graph.
 * 
 * @return a String representation of this graph
 */
@Override
public String toString() {
    // TODO
    StringBuilder sb = new StringBuilder();
    sb.append("{");
    for (int i = 0; i < edges.length; i++) {
        for (int j = 0; j < edges[i].size(); j++) {

            if (edges[i].containsKey(j)) {
                if (j < edges[i].size() - 1) {
                    sb.append("(" + i + "," + j + "),");
                } else if (j == edges[i].size() - 1) {
                    sb.append("(" + i + "," + j + ")");
                }

            }
        }
        if (i != edges.length - 1) {
            sb.append(", ");
        }
    }
    sb.append("}");
    System.out.println(sb.toString());
    return sb.toString();
}

由于我们的代码结构(我们开始使用的代码)具有 HashMap 的静态大小,如果我为 5 个节点制作一个图并且只添加其中的 3 个,我会得到一个 NPE。当我尝试打印这些内容时,由于 edges[i].containsKey(j)),我将得到一个 NPE。

最佳答案

您可能没有初始化 Edge 数组的每个元素。

在尝试检查键是否包含之前,您可以测试边索引是否不为空。

更改:

if (edges[i].containsKey(j))

致:

if (edges[i] != null && edges[i].containsKey(j))

由于短路评估,这是可能的:

http://en.wikipedia.org/wiki/Short-circuit_evaluation

如果值为 null,您甚至可能不想进入嵌套的 for 循环。在这种情况下,将嵌套的 for 循环包裹在条件周围以确保 Edges[i] != null。

关于java - 我自己的图形类中使用 HashMap 的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16090576/

相关文章:

java - for循环到jSTL forEach

java - 从 ImageVeiw 获取可绘制对象时出现空指针异常

algorithm - 寻找最小化树深的根

python - 带有悬停事件的网络图表

java - 无法将 Java 代码转换为 Kotlin 以实现 OnChangeListener

java - ActionEvent - 按下按钮时更改 JLabel

java - Sitemesh 与速度 #parse 工作不正确

java - 为什么 JAXB 不想验证

java - 当不可序列化引用字段值为 null 的可序列化类序列化时,不会引发异常

r - 如何在 R 中绘制哈密顿图?