前段时间,我正在开发一个程序,将值散列为哈希表(我不记得具体内容,而且具体内容与手头的问题无关)。无论如何,我将以下代码作为“recordInput”方法的一部分:
tempElement = new hashElement(someInt);
while(in.hasNext() == true)
{
int firstVal = in.nextInt();
if (firstVal == -911)
{
break;
}
tempElement.setKeyValue(firstVal, 0);
for(int i = 1; i<numKeyValues;i++)
{
tempElement.setKeyValue(in.nextInt(), i);
}
elementArray[placeValue] = tempElement;
placeValue++;
} // close while loop
} // close method
这部分代码给了我一个非常讨厌的错误 - 无论我如何重复它,无论我给出什么输入程序,它总会生成一个只有一个值的数组 - 最后一个。
正如我后来确定的那样,问题是因为我没有在循环中创建tempElement变量,并且因为在循环结束之前没有将值分配给elementArray[]
- 每个术语都是定义为“tempElement” - 当循环终止时,数组中的每个插槽都填充了tempElement的最后一个值。
我能够通过在while循环中移动tempElement的声明来修复此错误。我的问题,Stackoverflow,是否有另一种(读取:更好)的方法来避免这个错误,同时保持tempElement的变量声明在while循环之外。
答案 0 :(得分:2)
为什么要将变量声明保留在while循环之外?无论如何,只要你每次都将它分配给一个新的hashElement:
hashElement tempElement;
while (/*...*/) {
tempElement = new hashElement();
//...
但是,这肯定不是“更好”。一般来说,尽可能缩小范围。
答案 1 :(得分:1)
这不是关于变量的声明,而是关于您创建的对象。 java中的数组只包含引用到对象,所以如果你真的想在数组中有不同的对象,你需要在循环的某个地方用new
创建它们。
tempElement = new WhateverClass();
答案 2 :(得分:0)
Element tempElement;
while(condition){
tempElement = new HashElement();
//do more stuff
elementArray[index] = tempElement;
}