簡體   English   中英

使用HashMap在我自己的圖類中使用NPE

[英]NPE in my own graph class using HashMap

這是用於學校項目。 我們應該編寫一個在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。

您可能沒有初始化edges數組的每個元素。

您甚至可以在嘗試檢查鍵是否包含之前,可以測試edge索引是否不為null。

更改:

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

至:

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

這可能是由於短路評估:

http://zh.wikipedia.org/wiki/短路評估

如果該值為空,您甚至可能甚至不想輸入嵌套的for循環。 在這種情況下,將嵌套的for循環包裝在條件周圍,以確保edge [i]!= null。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM