br.read()
va lire un seul caractère . En outre, si vous lisez System.in
, il est probable que vous ne voyiez quelque chose que lorsque l'utilisateur appuie sur Retour. À ce stade, si vous utilisez Windows, il aura \r
et \n
à lire (ou seulement \n
sous Unix).
Je suppose que vous trouverez les valeurs lues par vos deuxième et troisième appels read()
sont \r
et \n
.
En outre, vous n'obtenez pas réellement les valeurs que vous voulez de toute façon - si quelqu'un entre '1' alors vous obtiendrez une valeur de 49, car c'est la valeur Unicode pour ce caractère. .
Vous devez utiliser readLine()
pour lire une ligne à la fois (puis analyser la chaîne avec Integer.parseInt()
Sinon, vous pouvez utiliser la classe Scanner
- Je ne peux pas dire que je l'ai jamais utilisé moi-même, mais il risquerez .. être utile pour vous
Enfin, il y a beaucoup de répétitions dans ce code - je vous suggère de refactoring en créant une méthode utilitaire par exemple, vous pourriez avoir:
public static int promptUserForInt(String prompt, int defaultValue,
BufferedReader reader)
throws IOException
{
while (true)
{
System.out.print(prompt);
try
{
String line = reader.readLine();
return Integer.parseInt(line);
}
catch (NumberFormatException e)
{
// Adjust as appropriate...
System.out.println
("Unable to parse input; please enter an integer.");
}
}
}
vous pouvez ensuite utilisez ceci très facilement:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int battMax = promptUserForInt("Enter minimum battery level:");
int battMin = promptUserForInt("Enter maximum battery level:");
int numNodes = promptUserForInt("Enter number of nodes required:");
Vous pouvez factoriser plus loin en prenant dans un Writer
ou BufferedWriter
pour afficher l'invite à - de cette façon vous pouvez tester plus facilement.
Enfin, je suggère que vous n'emballez pas chaque bit dans un bloc catch pour IOException
; Si vous ne pouvez pas lire l'entrée de la console, je suppose que vous ne voulez pas continuer de toute façon, vous devez donc vous comporter de la même manière si la première entrée génère cette exception ou la deuxième ou la troisième. Soit déclarer que votre méthode lance IOException
, ou avoir les trois lignes dans le même bloc try
, traitées par le même bloc catch
.
je suggère * pas * initialiser les variables locales à dummy valeurs.Au lieu de cela, déclarez-les le plus tard possible et utilisez explicitement une valeur par défaut si une exception se produit. –