2013-05-12 160 views
0

我用它做了一个代码,它遍历java.awt.Point类型Point对象的一维数组。我试图填充数组中的每个Point的x和y实例变量,实质上是array[iterator].x=iterator为什么此代码会导致NullPointerException?

代码

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)

+3

直接在问题中包含您的代码,并包含错误的完整堆栈跟踪。 – 2013-05-12 06:42:25

+0

始终复制/粘贴错误和异常输出。 – 2013-05-12 06:45:14

回答

1

可能是因为array[iterator]==nullarray==null 罢了。 为什么不只是调试?

+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – alecxe 2013-05-12 06:59:45

+0

,因为他在我回答时没有提供代码 – Dima 2013-05-12 08:17:12

2

因为当你初始化

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

它包含了所有空references.It创建的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

仅仅因为你的数组包含null元素。

您有:

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

假设,area = 2,你的阵列将是:

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

以下行:

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

您可以通过以下操作改变纠正缺少:map[n] = new Point();在对数组对象进行任何操作之前,因为它们是空的那一刻。

1

你得到NullPointerException异常,因为:

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

相关问题