为什么Java在这里抛出NullPointerException?

时间:2015-06-01 07:21:19

标签: java exception

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(N.x[3]);

    }

    /* ADD YOUR CODE HERE */

}

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

  1. 从文件中读取一个整数 - 数组的大小 在课堂上测试。在我的测试示例中,size = 10,所以没有发生任何超出范围的事情。

  2. 打印出来。

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

  4. 这里一切都开始了。由于我的班级是公开的,我已经开始了 构造函数我认为我有对象N作为属性 具有大小元素的数组x。 然而 ,当我正在尝试时 解决x,例如,

    StdOut.println(n.x的[3]);

    Java抛出NullPointerException。

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

5 个答案:

答案 0 :(得分:9)

您所做的是阴影,您使用本地变量x隐藏了您的字段x。所以你需要做的就是避免这个:

int[] x = new int [N];错误,如果您希望字段初始化而不是局部变量,那么您可以执行以下操作:x = new int [N];以获取更多信息,请阅读this

答案 1 :(得分:4)

更改构造函数中的第一行
int[] x = new int [N];

x = new int [N];

它应该有用......

实际上在构造函数中,当你说int [] x时,它正在创建一个局部变量,而不是将数据设置为公共变量x ...如果从构造函数的第一行移除int [],则它会启动公共变量&amp;你可以在main()方法中打印它们

答案 2 :(得分:2)

内部public Test(int n)

更改

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

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:0)

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