为什么这段代码会导致NullPointerException?

时间:2013-05-12 06:40:24

标签: java arrays nullpointerexception point

我创建了一个代码,它遍历来自java.awt.Point的Point类型的单维对象数组。我试图用基本上array[iterator].x=iterator填充数组中每个Point的x和y实例变量。

代码

package onmap;

import java.awt.Point;

public class OnMap {

    public static void main(String[] args) {

        int width=50;
        int height=50;
        int area = width * height;
        int xn;
        int yn;
        int i=0;
        int t=0;
        Point[] map;
        map = new Point[area];
        map[i].x=0;
        System.out.print("first x:" + map[i].x);


        for (int n=0; n<area-1;n++){ 
           if (i==width)
           {i=0; t++;}
           map[n].x=i;
           map[n].y=t;
           i++;       
           }

        for (int n=0;n<area-1;n++){
            xn = map[n].x;
            yn = map[n].y;
            System.out.print("x: " + xn);
            System.out.print("  y: "+yn);
            System.out.println("  n: "+n);
             }


    }

}

我不明白。为什么我收到空指针异常? (Netbeans 7.3,Java7)

5 个答案:

答案 0 :(得分:2)

因为初始化时

    Point[] map;
    map = new Point[area]; 

它包含所有空引用。它创建一个Point数组,默认情况下,数组中的每个元素都初始化为Point element=null。因此,当您尝试map[0].x时,它显然会抛出map[0]==null {3}}为null。请参阅NullPointerException,它告诉我们Java中的原始类型始终是零初始化的。引用初始化为null。因此,在引用数组中,每个元素的默认值将为Point[] map; map = new Point[area]; map[i] = new Point(); map[i].x=0; 引用。

您需要更改以下行:

{{1}}

答案 1 :(得分:2)

只是因为你的数组包含空元素。

你有:

...
map = new Point[area];
map[i].x=0;
...

假设,area = 2,您的数组将是:

map[0] = null;
map[1] = null;

您可以通过执行以下更改来更正它:

...
map = new Point[area];
// initialize Point array
for (int k=0; k < area; k++) {
    map[k] = new Point();
}
// ends initialization
map[i].x = 0;
...

答案 2 :(得分:1)

可能是因为array[iterator]==nullarray==null 而已。 为什么不调试?

答案 3 :(得分:1)

您收到NullPointerException,因为:

您已创建点对象数组并初始化点对象,您应首先使用new关键字创建点对象。但是在这里你没有为点对象创建内存,这是造成这种异常的原因。

答案 4 :(得分:0)

在对数组对象进行任何操作之前,不存在以下行:map[n] = new Point();,因为它们在此时为空。