获取java.lang.NullPointerException

时间:2014-01-27 03:28:16

标签: java debugging nullpointerexception

我无法相信我在如此微不足道的事情上遇到这么多麻烦。

无论出于何种原因,这些代码行都会导致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");

完美无缺。

4 个答案:

答案 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卡片类型对象,并使用这些对象填充数组,当您尝试打印它时,将返回并显示该值。