1

我有这种方法,它使用一个 for each 循环,其中有一个 if 语句

public static Apartment getApartment(String aNumber)
    
//for loop to iterate through the list of apartments         
{   
for (Apartment x : listOfApartments) 
  { 
  // Variable to hold the value of returned apartment    
  if (x.getApartmentNo().equalsIgnoreCase(aNumber))
  { Apartment chosen = x;
  }
  else 
  {JOptionPane.showMessageDialog(null, "Apartment not found");
  }
 
}  
return chosen;
} 

我收到未找到符号选择的错误。我想我在错误的地方声明了变量。有什么帮助吗?注意:这是一个接受 String 并返回 Object Apartment 的方法。

4

9 回答 9

3

你必须重写你的循环:在你完成循环之前,你不应该做出没有找到公寓的决定。您也不需要将值分配给临时变量 - 一旦找到公寓,立即将其归还。

您可以报告只有在完成循环后才找到公寓。

for (Apartment x : listOfApartments) { 
    // Variable to hold the value of returned apartment    
    if (x.getApartmentNo().equalsIgnoreCase(aNumber)) {
        return x;
    }
}
JOptionPane.showMessageDialog(null, "Apartment not found");
return null;
于 2012-04-25T04:18:19.003 回答
1

如果您的条件“x.getApartmentNo().equalsIgnoreCase(aNumber)”评估为假怎么办?
未创建“选择”的公寓数据类型!
你怎么能返回尚未实例化的东西?

于 2012-04-25T04:17:19.360 回答
1

这是一个范围问题,Chosen 是在 if 语句中创建的。

在外部声明它并将其设置为 null,然后如果条件为真,则该函数将返回 selected,如果不是,则返回 null。

public static Apartment getApartment(String aNumber)

//for loop to iterate through the list of apartments         
{   
Apartment chosen = null;

for (Apartment x : listOfApartments) 
  { 
  // Variable to hold the value of returned apartment    
  if (x.getApartmentNo().equalsIgnoreCase(aNumber))
  { chosen = x;
  }
  else 
  {JOptionPane.showMessageDialog(null, "Apartment not found");
  }

}  
return chosen;
}
于 2012-04-25T04:18:45.827 回答
1

编写该方法的一种简单(且正确)的方法是:

public static Apartment getApartment(String aNumber) {
    for (Apartment x : listOfApartments)
      if (x.getApartmentNo().equalsIgnoreCase(aNumber))
        return x;
    JOptionPane.showMessageDialog(null, "Apartment not found");
    return null;
}

不必为应该立即返回的值声明局部变量。此外,消息对话框应该只循环结束后出现,因为只有这样我们才能确定没有公寓有被搜索的号码。

关于问题中的代码,您是对的:该变量chosen应该在循环之前for声明,因此可以在循环之后引用它。您声明它的方式,它仅在if块内可见。

于 2012-04-25T04:20:21.607 回答
0

你是对的;你宣布选错地方了。在循环之前声明它,但将它(那里)分配给 null。这样,当您到达退货线时,它就可以保证有一个价值。

或者,假设只有一间公寓匹配(或者,您不在乎哪一间),您可以简单地return x;输入 if...true 情况。并在循环后返回 null,假设循环完成。此外,因为您正在循环播放,所以每个匹配的公寓都会显示“未找到”消息;您可能只想在循环完成后显示它而不找到公寓。

于 2012-04-25T04:17:09.893 回答
0

您代码中的变量chosen被困在创建它的范围内,因此不能在{}. 此外,if 语句的 else 分支在 for 循环的其余部分运行之前触发。

您实际上不需要保存选择的公寓,您可以立即将其归还,如下所示:

public static Apartment getApartment(String aNumber)
{   
    for (Apartment apartment : listOfApartments) 
    {   
        if (apartment.getApartmentNo().equalsIgnoreCase(aNumber))
            return x;
    }  
    JOptionPane.showMessageDialog(null, "Apartment not found");
    return null;
} 
于 2012-04-25T04:17:12.107 回答
0

在 for 循环之前声明变量“选择”,如下所示:

Apartment chosen = new Apartment();

当你找到你要找的公寓时,你也可以跳出 for 循环。如果列表很大,它可能会节省一些时间。

于 2012-04-25T04:18:04.743 回答
0

函数返回的变量chosen在这里超出范围,在循环开始之前在方法的开头声明它。

于 2012-04-25T07:59:43.093 回答
0

接受的答案是正确的,但我强烈建议避免使用多个返回语句。具有多个返回语句的代码更难管理。可能看起来还不是什么大问题,但是当代码增长时,这可能成为一个真正的问题。

public static Apartment getApartment(String aNumber)
{   
    Apartment result = null;
    for (Apartment apartment : listOfApartments) 
    {   
        if (apartment.getApartmentNo().equalsIgnoreCase(aNumber))
        {
             result = apartment;
             break;
        }
    }  
    if (result == null)
    {
        JOptionPane.showMessageDialog(null, "Apartment not found");
    }
    return result;
} 
于 2012-04-25T08:10:37.890 回答