0

我编写了一个代码,它从 java.awt.Point 中迭代 Point 类型的一维对象数组。我试图用本质上填充数组中每个 Point 的 x 和 y 实例变量array[iterator].x=iterator

编码

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)

4

5 回答 5

2

因为当你初始化

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

它包含所有空引用。它创建一个数组,数组中的Point每个元素默认初始化为Point element=null。所以,当你尝试map[0].x它时,它显然会抛出NullPointerException as map[0]==null。请参阅JLS,它告诉我们 Java 中的原始类型始终是零初始化的。引用被初始化为null。因此在引用数组中,每个元素的默认值都将被null引用。

你需要改变你的行,如下所示:

Point[] map;
map = new Point[area];
map[i] = new Point();
map[i].x=0;
于 2013-05-12T06:44:13.740 回答
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;
...
于 2013-05-12T06:47:19.697 回答
1

您收到 NullPointerException 是因为:

您已经创建了点对象数组,并且要初始化点对象,您应该首先使用 new 关键字创建点对象。但是在这里,您并没有为点对象创建内存,这是此异常背后的原因。

于 2013-05-12T07:24:14.947 回答
1

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

于 2013-05-12T06:43:18.437 回答
0

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

于 2013-05-12T06:47:34.547 回答