为什么我不能访问类数组索引

时间:2013-11-11 01:36:52

标签: java

当我尝试访问我创建的数组的元素并且不知道原因时,我一直收到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定义了默认构造函数。

7 个答案:

答案 0 :(得分:2)

您实际上回答了自己的问题:数组的元素应该单独初始化。默认情况下,对象数组为null。因此NullPointerException

答案 1 :(得分:2)

这正是java的工作原理。创建数组时,所有元素都初始化为null,您需要初始化它们。这是因为它无法确定你是否只想用默认构造函数构造它们,或者使用具有常量参数的不同构造函数,或者具有不同参数的不同构造函数,或null或什么。所以它只是将数组初始化为null

答案 2 :(得分:1)

说完list1 = new TreeNode[1000]后,

list1是一个充满空值的新数组。

所以你必须循环并初始化它

它没有击败新的点,因为当你说新的A [10000]时,就是分配一个新的数组,而不是它的'元素。说list1[0] = new TreeNode();分配一个元素。

我同意这不优雅,但这对你来说就是java。 :)

答案 3 :(得分:0)

当你调用new TreeNode[1000]时,你正在实例化一个引用数组,而不是对象本身。这是正常的,因为编译器不能只假设要调用哪个构造函数。想象一下,如果你有一个没有无参数构造函数的类:在这种情况下你认为编译器如何实例化它?

答案 4 :(得分:0)

此场景中涉及两个初始化

  1. 数组的初始化
  2. 数组元素的初始化

    new TreeNode [1000]仅初始化Array而不是Array Elements。

答案 5 :(得分:0)

list1 = new TreeNode[1000];

这只是创建一个new TreeNode数组。数组本身就是一个对象。所以不要让new关键字欺骗你。因此,使用上面的代码,您所拥有的只是TreeNode类型的数组。这只包含TreeNode类型的值。不给它任何TreetNode`值。你必须自己用代码来表达这一点。

答案 6 :(得分:0)

当您创建新的对象数组时,它默认填充null s,因此在您执行时

list1[0].edges

实际上你正在尝试执行

null.edges

这是不正确的,因为null没有edges

创建后数组未填充新对象的原因很少:

  1. 在许多(如果不是大多数)情况下,我们想要放置在已经存在的数组对象中,因此创建新的对象会浪费时间。
  2. 编译器应使用哪个构造函数来创建填充数组的对象?
  3. 在这样的构造函数中应该使用哪些参数?
  4. 请记住,数组可以是无法像抽象类或接口那样实例化的类数组。编译器如何填充这样的数组?应该使用哪个子类?
相关问题