La valeur de retour d'une instruction if dans une boucle for each
J'ai cette méthode, qui utilise une boucle for each avec une instruction if dans il
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;
}
J'obtiens une erreur que Symbole choisi de ne pas trouvé. Je pense avoir déclaré la variable dans le mauvais endroit.
Toute aide?
Note: C'est une méthode qui prend une Chaîne de caractères et renvoie un Objet de l'Appartement.
Vous devez vous connecter pour publier un commentaire.
Accepté réponse est correcte, mais je suggère fortement à éviter la pluralité de retour des déclarations. Code avec de multiples retours états est plus difficile à gérer. Peut ne pas sembler une grosse affaire, mais lorsque le code grandit, cela peut devenir un réel problème.
break
etif(result==null)
après la boucle) blesser la lisibilité de ce morceau de code. Bien que ce n'est certainement valide pratique pour les gros morceaux de code, des morceaux plus courts comme celui-ci peut bénéficier de multiples retours. Il n'y a pas de one-size-fits-all prononcer sur cette question; il est préférable d'aborder le problème au cas par cas.goto
et doit être utilisé comme souvent, dont l'essentiel est de ne jamaisQue vous avez à réécrire votre boucle: vous ne devez pas prendre une décision que l'appartement n'est pas jusqu'à la fin de la boucle. Vous n'avez pas besoin d'affecter la valeur de la variable temporaire soit - une fois l'appartement trouvé, de le retourner tout de suite.
Vous pouvez signaler que l'appartement n'est pas seulement quand vous avez fini la boucle.
que faire si votre condition "x.getApartmentNo().equalsIgnoreCase(nombre d'hommes)" a la valeur false?
l'Appartement de type de données "choisi" est pas créé!
comment pouvez-vous retourner quelque chose qui n'a pas été instancié?
C'est un problème de portée, Choisi est créé à côté de l'instruction if.
Déclarer à l'extérieur et mis à null, alors la fonction renvoie choisi si la condition est vraie, ou null si il n'est pas.
Vous avez raison; vous avez déclaré choisi dans le mauvais endroit. Déclarer juste avant la boucle, mais l'affecter (y) à la valeur null. De cette façon, c'est la garantie d'avoir une valeur lorsque vous atteignez la ligne de retour.
Sinon, en supposant que l'un appartement de match (ou, vous ne vous souciez pas lequel), vous pouvez simplement mettre
return x;
dans le si...vrai cas. Et renvoie la valeur null après la boucle, en supposant que la boucle est terminée. Aussi, parce que vous êtes en boucle, chaque appartement n'est pas match montrera "pas trouvé" message; vous probablement ne voulez afficher que, après la boucle est terminée sans la recherche d'un appartement.La variable
chosen
dans votre code a été pris au piège à l'intérieur de la portée, il a été créé, donc ça ne peut pas être utilisé en dehors de la{}
. Aussi, l'autre branche de l'instruction si déclenche avant que le reste de la boucle de courant.Vous n'avez pas vraiment besoin pour économiser de l'appartement choisi, vous pouvez simplement retourner immédiatement, comme ceci:
Déclarer la variable "choisie", avant la boucle for comme ceci:
Aussi, vous pouvez sortir de la boucle une fois que vous trouver l'appartement que vous recherchez. Si la liste est grande, il pourrait gagner du temps.
Un simple (et corriger) la façon d'écrire la méthode serait:
Il n'est pas nécessaire de déclarer une variable locale pour une valeur qui doit être retourné immédiatement. Aussi, la boîte de dialogue de message doit être présenté seulement après la boucle se termine, parce que seulement alors, nous en sommes sûrs qu'aucun appartement n'avait le nombre recherché.
Concernant le code de la question, vous avez raison: la variable
chosen
doit avoir été déclaré avant lafor
boucle, de sorte qu'il peut être référencé après la boucle. La façon dont vous l'a déclaré, il est visible qu'à l'intérieur de laif
bloc.Variable
chosen
retournée par la fonction est hors de portée ici, le déclarer au début de la méthode, juste avant la boucle commence.