2010-06-07 268 views
1

一段时间以来,我一直在研究一个将值散列到散列表中的程序(我不记得具体情况,具体细节本身与问题无关)。不管怎么说,我有下面的代码为“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 

的这部分代码是给我一个非常讨厌的错误 - 无论我怎么finagled它,无论我所付出的投入该程序,它总是会产生一个只有一个值的数组 - 最后一个。

问题,正如我后来确定的那样,是因为我没有在循环中创建tempElement变量,并且因为在循环结束之前没有将值分配给elementArray[] - 每个术语都定义为“tempElement” - 当循环结束时,数组中的每个插槽都充满了tempElement所拍摄的最后一个值。

我能够通过在while循环中移动tempElement的声明来修复此错误。我的问题,Stackoverflow,是否有另一种(更好的)方法来避免这个bug,同时保持tempElement的变量声明在while循环之外。

+1

你最好了解Java编码惯例:http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html。类名应以大写字母开头。 – 2010-06-07 15:31:28

回答

2

为什么要在while循环之外保留变量声明?无论如何,只要你每次将它分配给一个新的hashElement:

hashElement tempElement; 
while (/*...*/) { 
    tempElement = new hashElement(); 
    //... 

虽然这当然不是“更好”。一般来说,尽量缩小范围。

1

这不是关于变量的声明,而是关于你创建的对象。 java中的数组仅将引用指向对象,因此如果实际上想要在数组中有不同的对象,则需要在循环中的某处使用new创建它们。

tempElement = new WhateverClass(); 
+0

或者只是'elementArray [placeValue] = new ...'并且完全跳过临时变量。 – 2010-06-07 15:32:26

+0

不是当你打电话给它的人。调用setArray [placeValue] .setWhatever(whatever)这样的setter是丑陋的,应该受到严厉的惩罚。 – unbeli 2010-06-07 15:35:28

+0

我认为临时变量是必要的,因为OP正在对其执行操作,需要在构建后完成。 – 2010-06-07 15:35:35

0
Element tempElement; 

while(condition){ 
    tempElement = new HashElement(); 

    //do more stuff 

    elementArray[index] = tempElement; 
}