当我尝试访问我创建的数组的元素并且不知道原因时,我一直收到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定义了默认构造函数。
答案 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)
此场景中涉及两个初始化
数组元素的初始化
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
。
创建后数组未填充新对象的原因很少: