【问题标题】:Why does this code cause a NullPointerException?为什么这段代码会导致 NullPointerException?
【发布时间】:2013-05-12 06:40:23
【问题描述】:

我编写了一个代码,它遍历 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)

【问题讨论】:

  • 将您的代码直接包含在问题中,并包含错误的完整堆栈跟踪。
  • 总是复制/粘贴错误和异常输出。

标签: java arrays nullpointerexception point


【解决方案1】:

因为当你初始化时

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

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

你需要像下面这样改变你的行:

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

【讨论】:

    【解决方案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;
    ...
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你得到 NullPointerException 因为:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2011-03-16
            • 2012-08-27
            • 1970-01-01
            • 2020-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-01-18
            • 2014-10-05
            相关资源
            最近更新 更多