Простая проблема ввода Java - PullRequest
1 голос
/ 06 января 2010

Я новичок в Java и у меня проблемы с получением ввода. Это мой код, который, кажется, получает первый ввод по мере необходимости, но затем пропускает следующие два вызова функции «read»?

Есть предложения?

     //  open up standard input
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int battMax, battMin, numNodes=0;
    System.out.print("Enter minimum battery level:");
    try {
         battMin = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter maximum battery level:");
     try {
        battMax = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    System.out.print("Enter number of nodes required:");
     try {
        numNodes = br.read();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

Ответы [ 3 ]

6 голосов
/ 06 января 2010

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.

3 голосов
/ 06 января 2010

br.read() читает символ. Используйте Integer.parseInt(br.readLine()), который будет читать всю строку и преобразовывать ее в int.

Кроме того, инициализируйте все ваши локальные переменные:

int battMax=0, battMin=0, numNodes=0;
0 голосов
/ 06 января 2010

Если вы используете Java 1.5 или более позднюю версию, вы можете использовать java.util.Scanner

public static getInt(String prompt){
    int n = 0;
    try {
        System.out.print(prompt);
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt();
    }
    catch(Exception ex){
       ex.printStackTrace();
    }
    return n;
}

Пример использования:

int battMax = getInt("Enter minimum battery level:");
int battMin = getInt("Enter maximum battery level:");
int numNodes = getInt("Enter number of nodes required:");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...