使用HashMap在我自己的图表类中的NPE

时间:2013-04-18 18:33:08

标签: 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。

1 个答案:

答案 0 :(得分:1)

您可能没有初始化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。