2016-04-03 94 views
0

因此,有一个类Hotel,它包含20个房间,形式为矩阵4x5(4层,每层5个房间)。该类Room具有的属性:for循环外的变量范围内的故障

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

对于occupation,真正意味着忙碌,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,而当我设标志设置为false,函数返回false。
我之所以要一些值分配给在第一行标志,是因为编译器显示:

Error: variable flag might not have been initialized 

所以,问题是,它好像方法从不与循环执行代码。
我知道在循环中定义的变量不存在于循环外部,但在外部定义的变量应该在循环中更改它们的值。 像这个问题在这里: Java - Access variable inside and outside of for-loop

+3

你的代码不能编译。'boolean flag false;'无效。修复该声明并重新编译。 –

+0

对不起,我编辑了queston,现在编译。最初,它说'boolean flag = false;' – misty

+0

为什么你在这里做一个循环呢?它是一个4 x 5阵列。你知道楼层和房间号码(例如2,3)。直接从房间阵列中获取房间(例如,Room room = rooms [2] [3])。 – KevinO

回答

1

我发现问题所在。
它实际上是索引floorNumber,矩阵rooms[floorNumber][]当然是从0到3(有4个楼层)。
但在现实生活中,楼层号码从1走,和我经过参数

reserve(int floorNumber,int roomNumber)

没有考虑到。
因此,我只是在方法体内将floorNumber减1,并且现在可以工作。

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

当我这样做,编译器说: '1错误发现: 错误:缺少返回语句' – misty

+0

@LazyLady:对不起,我错过了一级大括号。现在修复。 – Nayuki

+0

没有...我想我会用调试器... – misty