在for循环外部具有可变范围的故障

时间:2016-04-03 18:31:49

标签: java scope

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

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

对于occupation,true表示忙,false表示免费。

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

reserve(int floorNumber, int roomNumber) 

此方法应检查职业是真还是假 如果是,则保留失败,如果为假,我应该使用方法

将占用设置为true
setOccupation(boolean t).  

此外,方法reserve返回布尔值(true或false),具体取决于保留是否成功。 你猜,在那种方法中,是一个变量范围的问题。 它就是:

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;
  }

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

Error: variable flag might not have been initialized

所以,问题是看起来方法永远不会用for循环执行代码 我知道循环中定义的变量不存在于循环外部,但外部定义的变量应该在循环中更改它们的值。 喜欢这个问题: Java - Access variable inside and outside of for-loop

2 个答案:

答案 0 :(得分: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;
}

但是如果你坚持使用你使用旗帜的原始方法,那么:首先给它一个假的值(如果没有房间成功的话)。当我们找到一个未占用的房间(成功)时,将其设置为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 :(得分:1)

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

reserve(int floorNumber,int roomNumber)

没有考虑到这一点 所以,我只是在方法体中将floorNumber减1,现在就可以了。