我无法相信我在如此微不足道的事情上遇到这么多麻烦。
无论出于何种原因,这些代码行都会导致nullpointerexception
Card[] arr = new Card[2];
System.out.print(arr[0].val + "\n"); //this is the line throwing the error
卡片被定义为
public class Card {
public int val;
public char suit;
}
编译成功,我确保它引用了正确的类。我觉得我忽略了一些小细节。
我也注意到了
Card a = new Card();
Card b = new Card();
Card[] arr = {a, b};
System.out.print(arr[0].val + "\n");
完美无缺。
答案 0 :(得分:7)
当您声明Card[] arr = new Card[2];
时,数组内的每个引用都是null
。在您尝试在其上调用方法之前,必须在每个位置实例化一个新的Card()
。
这就是为什么你的第二种方法有效 - 你有两个Card
的新实例,并且你在之前填充它们你调用它上面的任何方法
答案 1 :(得分:1)
您已在内存中为您的阵列创建了 space (您已“初始化”它),但您没有在中添加任何。
尝试类似
的内容arr[0] = new Card();
//NOW there's something in arr[0];
System.out.println(arr[0]);
这就是为什么它适用于最终的代码片段,因为这正是你所做的。
答案 2 :(得分:1)
Card[] arr = new Card[2];
arr reference包含长度为2的Array对象。此外,上述语句指出数组中的每个对象都是类类型Card。默认情况下,上述语句不会创建任何对象,并且数组中的所有索引都将具有空引用。
arr[0] = null;
arr[1] = null;
arr [0] =新卡();
创建卡对象,其引用为arr [0],即数组的第一个索引
基本规则:将使用其索引位置的默认值创建任何数组。
原始数组将具有该基本类型的默认值,例如int []将具有0,boolean []具有false
创建一个Object数组,其中包含对null的引用,因为Object default value为null。创建的引用数等于其初始化中提供的长度。
arr [0]本身不是一个对象。 arr [0]是对应该在Java中显式创建的对象的引用。
答案 3 :(得分:0)
来自Java Language Specification,
每当有一个新对象时,数组组件是创建和初始化到默认值(§4.12.5)的未命名变量创建一个数组......
您的对象数组在第一种情况Card[] arr = new Card[2];
中声明,并使用null
进行初始化。由于数组未填充卡类型对象,因此它实际上指向默认的null
值,当您尝试打印时,会抛出NullPointerException
。
在第二种情况Card[] arr = {a, b};
中,您创建了new
卡片类型对象,并使用这些对象填充数组,当您尝试打印它时,将返回并显示该值。