br.read()
будет читать один символ . Кроме того, если вы читаете из System.in
, он, вероятно, увидит что-то только тогда, когда пользователь нажмет клавишу возврата - в этот момент, если вы работаете в Windows, у него будут дополнительные \r
и \n
для чтения (или просто \n
в Unix).
Я подозреваю, что вы найдете значения, прочитанные вашим вторым и третьим read()
вызовами \r
и \n
.
Более того, вы в любом случае не получаете желаемых значений - если кто-то введет «1», вы получите значение 49, поскольку это значение Unicode для этого символа.
Вы должны использовать readLine()
для одновременного чтения строки (а затем проанализировать строку с помощью Integer.parseInt()
. В качестве альтернативы вы можете использовать Scanner
класс - я не могу сказать, что когда-либо использовал его сам, но может быть полезным для вас.
Наконец, в этом коде много повторений - я бы посоветовал вам реорганизовать его, создав служебный метод. Например, вы можете иметь:
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.");
}
}
}
Вы можете использовать это очень легко:
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:");
Вы можете выполнить дальнейший рефакторинг, набрав Writer
или BufferedWriter
, чтобы отобразить подсказку - таким образом, вы могли бы легче ее проверить.
Наконец, я бы посоветовал вам не включать каждый бит в блок catch для IOException
; если вы не можете прочитать ввод с консоли, я подозреваю, что вы все равно не хотите продолжать, поэтому вы хотите вести себя одинаково, независимо от того, генерирует ли первый вход это исключение, второй или третий. Либо объявите, что ваш метод генерирует IOException
, либо используйте все три строки в одном блоке try
, обработанные одним и тем же блоком catch
.