[英]why can i not access a class array index
當我嘗試訪問我創建的數組的元素並且不知道為什么時,我一直收到NullPointerException。 拋出的代碼:
TreeNode[] list1;
list1 = new TreeNode[1000];
list1[0].edges = new EdgeNode(1); //Throw line
但是如果我這樣做,它會起作用:
TreeNode[] list1;
list1 = new TreeNode[1000];
list1[0] = new TreeNode();
list1[0].edges = new EdgeNode(1);
我不知道為什么。 顯然,我可以遍歷整個數組並創建新元素,但這不會破壞新觀點嗎? 另外,如果相關的話,我已經定義了TreeNode的默認構造函數。
您實際上回答了自己的問題:數組的元素應單獨初始化。 默認情況下,對於對象數組,它們為null
。 因此, NullPointerException
。
這正是java的工作方式。 創建數組時,所有元素都初始化為null
,並且需要初始化它們。 這是因為無法找到您是要使用默認構造函數還是使用具有恆定參數的其他構造函數,還是使用具有可變參數的其他構造函數(或者為null)構造它們。 因此,它只是將數組初始化為null
。
在您說list1 = new TreeNode[1000]
,
list1是一個包含空值的新數組。
所以你必須遍歷並初始化它
它不會擊敗new的觀點,因為當您說new A [10000]時,它分配的是新數組,而不是其元素。 說list1[0] = new TreeNode();
分配一個元素。
我同意這不是很優雅,但是適合您。 :)
當您調用new TreeNode[1000]
您將實例化一個引用數組,而不是對象本身。 這是正常現象,因為編譯器不能僅假設要調用哪個構造函數。 想象一下,如果您有一個沒有無參數構造函數的類:在這種情況下,您如何認為編譯器必須實例化它?
在這種情況下涉及兩個初始化
數組元素的初始化
new TreeNode [1000]僅初始化數組,而不初始化數組元素。
list1 = new TreeNode[1000];
這只是創建一個new
TreeNode
數組。 數組本身是一個對象。 因此,請勿讓new
關鍵字欺騙您。 因此,使用上面的代碼,您所擁有的只是一個TreeNode
類型的數組。 那只保存TreeNode
類型的值。 不給它任何TreetNode的值。 您必須使用代碼來明確地做到這一點。
創建新的對象數組時,默認情況下會用null
填充,因此在執行時
list1[0].edges
實際上,您正在嘗試執行
null.edges
這是不正確的,因為null
沒有edges
。
創建數組后,沒有用新對象填充數組的原因很少:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.