[英]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.