Java中的空指针错误?

时间:2011-10-10 22:11:00

标签: java nullpointerexception pass-by-reference

我对这个论坛的事情很新。我总是非常担心在论坛上发帖,但是经过两周的反对我的代码试图使其工作后我终于放弃了。下面的代码是一些较大代码的关键部分,但我想我有点精确定位问题部分。我有一个2D对象数组,一旦创建它就应该默认初始化。但是,这似乎没有发生,价值仍为空。这可能是Java无法通过引用传递的结果吗?如果是这样,为什么原始2D数组被实例化得很好?拉谢先生,谢谢你。

    class ObjectThing
    {
        int someInt;
        double someDouble;

        public ObjectThing()
        {
            someInt = 0;
            someDouble = 0;
        }

        synchronized private void someIntIncrement ()
        {
           someInt++;
        }

        synchronized public void addSomeDouble (double sd)
        {
            someDouble += sd;
            someIntIncrement ();
        }

        synchronized public String toString ()
        {
            return someInt + "," + someDouble;
        }
  }


  class AnotherObject
  {
          String name;
          ObjectThing [][] someObjectMAtrix;
          double [][] someDoubleMAtrix01;
          double [][] someDoubleMAtrix02;   

          public AnotherObject()
          {
          }

          private void initDouble (double [][] mat)
          {
             for (double [] i: mat)
                for (double j: i)
                   j = 0;
          }

          private void initObject (ObjectThing [][] so)
          {
              for (ObjectThing [] i: so)
                 for (ObjectThing j: i)
                    j = new ObjectThing ();
          }         

          public void init (int r, int c)
          {
              someObjectMAtrix =  new ObjectThing [r][c];
              someDoubleMAtrix01 = new double [r][c];
              someDoubleMAtrix01 = new double [r][c];         
          initObject (someObjectMAtrix);
              initDouble (someDoubleMAtrix01);
              initDouble (someDoubleMAtrix02);
          }
   }

   class Driver
   {
       public static void main (String [] args)
       {
            initializeMethod();
       }

       public void initializeMethod ()
       {
            AnotherObject [] anotherObjectArray = new AnotherObject [1];
            for (AnotherObject i: anotherObjectArray)
            {
                i.init(72,72);
            }
       }
   } 

4 个答案:

答案 0 :(得分:2)

问题在于你的initializeMethod:

        AnotherObject [] anotherObjectArray = new AnotherObject [1];
        for (AnotherObject i: anotherObjectArray)
        {
            i.init(72,72);
        }

Going Object[] myArray = new Object[1]仅为数组分配空间。它实际上并不创建这些对象。你的代码块应该是

        AnotherObject [] anotherObjectArray = new AnotherObject [1];
        anotherObjectArray[0] = new AnotherObject();
        for (AnotherObject i: anotherObjectArray)
        {
            i.init(72,72);
        }

这有点笨重。我假设您需要将AnotherObject放入数组,而您只是没有显示它。如果您只需要其中一个对象,则直接创建它。你应该看看Lists

答案 1 :(得分:0)

我相信这是设计的。原语将在堆栈上分配,并且默认情况下始终具有某种值。对象在堆上分配,并将通过引用传递。默认情况下,这些引用在默认情况下都不会指向任何内容。

答案 2 :(得分:0)

你刚刚初始化了AnotherObject对象的数组......但是在数组的第一个字段中没有AnotherObject ...当你得到它时它是null,因为你没有初始化它。 在initializeMethod中,您必须执行以下操作:

AnotherObject [] anotherObjectArray = new AnotherObject [1];
 for (AnotherObject i: anotherObjectArray)
    {
        i = new AnotherObject();
        i.init(72,72);
    }

喝彩!

答案 3 :(得分:0)

Java编译器将强制您初始化变量,基元或引用类型(如对象),否则将生成编译器错误并失败。

但是,数组初始化将创建所需大小的数组,每个元素都设置为默认值。对于基元,对于数字类型,0,对于布尔值,false。对于引用类型,默认值为null。这是你问题的根源。

您正确初始化数组,但不要使用有效值填充它。因此,它与传递引用无关,而是与正确的数组初始化有关,并且知道新初始化数组的默认值。

具体来说,您使用for-each构造来遍历数组。此构造对集合/数组中的每个对象执行操作。

因此,这段代码:

AnotherObject [] anotherObjectArray = new AnotherObject [1];
for (AnotherObject i: anotherObjectArray){
    i.init(72,72);
}

等同于此代码:

AnotherObject [] anotherObjectArray = new AnotherObject [1];
for(int count=0; count <  anotherObjectArray ; count++){
    AnotherObject tempObj = anotherObjectArray[i]; // This is null, because anotherObjectArray[i] hasn't been initialised yet
    tempObj.init(72,72); // This is where we get the NullPointerException :(
}

你能看到问题吗?您正在尝试对null执行操作,因此NullPointerException

我相信你的确想是这个:

AnotherObject [] anotherObjectArray = new AnotherObject [1];
for(int count=0; count <  anotherObjectArray ; count++){
    AnotherObject tempObj = new AnotherObject(); // Here we create the new object
    tempObj.init(72,72); // Initialise the newly created object
    anotherObjectArray[i] = tempObj; // Now we store in the array :)
}

我希望我能够清楚地解释这一点,但如果我没有,请请澄清:)