我对这个论坛的事情很新。我总是非常担心在论坛上发帖,但是经过两周的反对我的代码试图使其工作后我终于放弃了。下面的代码是一些较大代码的关键部分,但我想我有点精确定位问题部分。我有一个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);
}
}
}
答案 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 :)
}
我希望我能够清楚地解释这一点,但如果我没有,请请澄清:)