【问题标题】:Variable Assignment and loops变量赋值和循环
【发布时间】:2011-02-28 18:22:25
【问题描述】:

不久前,我正在开发一个将值散列到散列表中的程序(我不记得具体内容,具体内容本身与手头的问题无关)。无论如何,我将以下代码作为“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[] - 每个术语都被定义而不是as "tempElement" -- 当循环终止时,数组中的每个槽都填充了 tempElement 所取的最后一个值。

我可以通过在 while 循环中移动 tempElement 的声明来修复这个错误。 Stackoverflow,我的问题是是否有另一种(阅读:更好的)方法来避免这个错误,同时将 tempElement 的变量声明保留在 while 循环之外。

【问题讨论】:

标签: java loops variable-assignment


【解决方案1】:

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

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

虽然它肯定不是“更好”。一般来说,尽可能缩小变量的范围。

【讨论】:

    【解决方案2】:

    这不是关于变量的声明,而是关于你创建的对象。 java 中的数组只保存对象的引用,所以如果你真的想在数组中有不同的对象,你需要在循环中的某处使用new 创建它们。

    tempElement = new WhateverClass();
    

    【讨论】:

    • 或者只是 elementArray[placeValue] = new ... 并完全跳过临时变量。
    • 当你调用 setter 时不会。调用像 elementArray[placeValue].setWhatever(whatever) 这样的设置器是丑陋的,应该受到严厉的惩罚。
    • 我认为 temp var 是必要的,因为 OP 正在对其进行操作,需要在构建后完成。
    • @Andrew, unbeli:有必要,不;丑陋...取决于。同意这可能是不好的风格。但数组一般都很丑陋,我看不出为什么它不应该是 List 而是用 add 替换分配。
    • @Mark,数组非常漂亮、快速且高效。而且,更改为列表并不能解决问题
    【解决方案3】:
    Element tempElement;
    
    while(condition){
        tempElement = new HashElement();
    
        //do more stuff
    
        elementArray[index] = tempElement;
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 2011-07-12
      • 2019-06-09
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      • 2014-01-21
      相关资源
      最近更新 更多