为什么Java在这里抛出NullPointerException?

public class Test { public int [] x; public Test(int N) { int[] x = new int [N]; for (int i=0;i<x.length;i++) { x[i]=i; StdOut.println(x[i]); } } public static void main(String[] args) { String path = "/Users/alekscooper/Desktop/test.txt"; In reader = new In(path); int size=reader.readInt(); StdOut.println("Size = "+size); Test N = new Test(size); StdOut.println(Nx[3]); } /* ADD YOUR CODE HERE */ } 

大家好。 我正在通过阅读Robert Sedgwick关于算法的书来学习Java,我正在使用他的库,例如StdOut。 但问题是关于Java的一般情况。 我不明白为什么Java会抛出NullPointerException。 我知道这一般意味着什么,但我不知道为什么会这样,因为这就是我认为我在做的事情:

  1. 读取文件中的整数 – 类Test中的数组大小。 在我的测试示例中,size = 10,因此不会发生任何超出范围的事情。

  2. 打印出来。

  3. 创建Test类型的对象N. 在这个对象中,我想我创建了一个我刚从文件中读取的大小数组。 为了好玩,我将它从0初始化为size-1并打印出来。 到现在为止还挺好。

  4. 在这里一切都开始了。 由于我的类是公共的并且我运行构造函数,我认为我有对象N作为属性具有带有大小元素的数组x。 但是 ,当我试图解决x时,例如,

    StdOut.println(NX [3]);

    Java抛出NullPointerException。

为什么这样? 请帮忙,非常感谢你的时间。

你所做的就是阴影你用局部变量x遮蔽你的场x 。 所以你需要做的就是避免这个:

int[] x = new int [N]; 是错误的,如果你想要你的字段初始化而不是局部变量那么你可以做类似的事情: x = new int [N]; 欲了解更多信息,请阅读

更改构造函数中的第一行

 int[] x = new int [N]; 

 x = new int [N]; 

它应该工作……

实际上在构造函数中,当你说int [] x时,它正在创建一个局部变量,而不是将数据设置为公共变量x …如果你从构造函数的第一行中删除int [],那么它会启动公共变量并且你将能够在main()方法中打印它们

内部public Test(int n)

更改

 int[] x = new int [N]; // Creating a local int array x 

 x = new int [N]; // Assigning it to x 

每个人都给出了可行的代码。 但原因是所谓的变量范围。 当你创建一个变量时(通过说int [] x,你将x声明为一个整数数组,并且通过说x = new int [4]你将一个新数组赋给x)。 如果您在任何地方使用相同的变量名称x并继续为其分配内容,则在您的class级中它将是相同的。

但是,如果你再次声明int [] x – 那么你创建了另一个名为x的变量 – 现在这会导致重复的变量错误,或者如果你在更窄的“范围”中声明,你将会重写你先前的x声明。

请阅读有关java变量范围的信息,以了解范围界定的工作原理。

  int size=reader.readInt(); // size < 3 StdOut.println(Nx[3]); // length of x[] less than 3, so x[3] case NullPointException