【问题标题】:Troubles with variable scope outside the for loopfor 循环外变量范围的问题
【发布时间】:2023-03-04 10:49:01
【问题描述】:

所以,有一个类Hotel,它包含 20 个房间,以矩阵 4x5 的形式(4 层,每层 5 个房间)。 Room 类具有以下属性:

floorNumber(int),  
roomNumber(int),  
numberOfBeds(int),  
occupation(boolean)
etc.

对于occupation,true 表示忙,false 表示空闲。

我必须在酒店中实施的一种方法是预订房间

reserve(int floorNumber, int roomNumber) 

这个方法应该检查职业是真还是假。
如果是真的,那么预订失败,如果是假的,我应该设置职业为真,方法

setOccupation(boolean t).  

另外,方法reserve 返回布尔值(真或假),取决于预订是否成功。 您猜想,在这种方法中,一个变量的范围存在问题。 就是这样:

public boolean reserve(int floorNumber, int roomNumber){
    boolean flag = false;
    for ( int i = 0; i < 5; i++){
      if(rooms[floorNumber][i].getRoomNumber() == roomNumber){//every element in matrix rooms has this property: rooms[floorNumber][some_number_from_1_to_5]
        if (rooms[floorNumber][i].getOccupancy() == false){
          rooms[floorNumber][i].setOccupancy(true);
          flag = true;
        }
        else
          flag = false;
      }
    }
    return flag;
  }

问题是,当我(在第一行)将 flag 设置为 true 时,函数返回 true,而当我将 flag 设置为 false 时,函数返回 false。
我必须在第一行为标志分配 some 值的原因是因为编译器显示:

Error: variable flag might not have been initialized

所以,问题在于方法似乎永远不会使用 for 循环执行代码。
我知道在循环中定义的变量在循环之外不存在,但是在循环之外定义的变量应该在循环中改变它们的值。 就像这里的这个问题一样: Java - Access variable inside and outside of for-loop

【问题讨论】:

  • 您的代码无法编译。 boolean flag false; 无效。修复该语句,然后重新编译。
  • 对不起,我编辑了queston,它现在可以编译了。原来是boolean flag = false;
  • 你为什么要在这里循环?它是一个 4 x 5 阵列。您知道楼层和房间号(例如,2、3)。直接从 rooms 数组中获取房间(例如 Room room = rooms[2][3])。
  • @RealSkeptic 你是对的。我误读了这个问题。对不起。
  • @LazyLady 使用您的调试器,并逐步执行您的代码。如果它从不改变标志,有一个简单的解释:表达式rooms[floorNumber][i].getRoomNumber() == roomNumber 永远不会为真。

标签: java scope


【解决方案1】:

有一种更简单的方法可以完成您想做的事情。您根本不需要布尔标志;您可以在成功时立即返回 true,如果整个循环执行但没有找到房间,则返回 false。

public boolean reserve(int floorNumber, int roomNumber){
  for (int i = 0; i < 5; i++) {
    //every element in matrix rooms has this property:
    //rooms[floorNumber][some_number_from_1_to_5]
    if (rooms[floorNumber][i].getRoomNumber() == roomNumber){
      if (rooms[floorNumber][i].getOccupancy() == false){
        rooms[floorNumber][i].setOccupancy(true);
        return true;
      }
    }
  }
  return false;
}

但是,如果您坚持应用使用标志的原始方法,那么:首先给它一个 false 值(以防没有空间成功)。当我们找到一个空房间(成功)时,将其设置为 true。如果我们发现有人占用的房间,不要碰标志值

public boolean reserve(int floorNumber, int roomNumber){
  boolean flag = false;
  for (int i = 0; i < 5; i++) {
    //every element in matrix rooms has this property:
    //rooms[floorNumber][some_number_from_1_to_5]
    if (rooms[floorNumber][i].getRoomNumber() == roomNumber){
      if (rooms[floorNumber][i].getOccupancy() == false){
        rooms[floorNumber][i].setOccupancy(true);
        flag = true;
      } // else DO NOTHING
    }
  }
  return flag;
}

【讨论】:

  • 当我这样做时,编译器会说:1 error found: Error: missing return statement
  • @LazyLady:对不起,我错过了一级大括号。现已修复。
【解决方案2】:

我发现了问题所在。
当然,它实际上是矩阵 rooms[floorNumber][] 中的索引 floorNumber,从 0 到 3(有 4 层)。
但在现实生活中,楼层数从 1 开始,我将参数传递给

reserve(int floorNumber,int roomNumber)

不考虑这一点。
所以,我只是在方法体中将 floorNumber 减 1,它现在可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2011-05-27
    • 2014-08-05
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多