簡體   English   中英

為什么我不能訪問類數組索引

[英]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]您將實例化一個引用數組,而不是對象本身。 這是正常現象,因為編譯器不能僅假設要調用哪個構造函數。 想象一下,如果您有一個沒有無參數構造函數的類:在這種情況下,您如何認為編譯器必須實例化它?

在這種情況下涉及兩個初始化

  1. 數組初始化
  2. 數組元素的初始化

    new TreeNode [1000]僅初始化數組,而不初始化數組元素。

list1 = new TreeNode[1000];

這只是創建一個new TreeNode數組。 數組本身是一個對象。 因此,請勿讓new關鍵字欺騙您。 因此,使用上面的代碼,您所擁有的只是一個TreeNode類型的數組。 那只保存TreeNode類型的值。 不給它任何TreetNode的值。 您必須使用代碼來明確地做到這一點。

創建新的對象數組時,默認情況下會用null填充,因此在執行時

list1[0].edges

實際上,您正在嘗試執行

null.edges

這是不正確的,因為null沒有edges

創建數組后,沒有用新對象填充數組的原因很少:

  1. 在很多(如果不是大多數)情況下,我們希望放置在已經存在的數組對象中,因此創建新對象將浪費時間。
  2. 編譯器應使用哪個構造函數來創建將填充數組的對象?
  3. 在此類構造函數中應使用哪些參數?
  4. 請記住,數組可以是無法實例化的類的數組,例如抽象類或接口。 編譯器將如何填充此類數組? 應該使用哪個子類?

暫無
暫無

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

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