Почему такое странное поведение из моего заявления переключателя? - PullRequest
1 голос
/ 08 декабря 2011

Возьмите следующий код, написанный на Java:

choice = keyboard.nextByte();

        switch (choice)
        {
            case (byte) 4:
                System.out.print("Input the layout type: ");
                layoutType = keyboard.nextLine();
                System.out.print("Input the layout name: ");
                layoutName = keyboard.nextLine();
                break;
            default:
                break;
        }

Когда я запускаю программу, я получаю следующее:

Введите тип макета: введите имя макета:

Я получаю приглашение для обоих входов одновременно! Это почему? Разве программа не должна останавливаться там, где написано "keyboard.nextLine()"? Он делает это вне оператора switch, но не внутри него. Почему запрос пользователя для ввода внутри оператора switch вызывает такое странное поведение?

=================================== UPDATE:

Да, все верно. keyboard является экземпляром класса java.util.Scanner.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Это потому, что вы вводите новую строку для чтения байта, а новая строка почему-то считается вводом для последующего вызова readLine().Добавьте пустышку readLine() после readByte(), чтобы решить:

choice = keyboard.nextByte();
keyboard.readLine(); // dummy readline
1 голос
/ 08 декабря 2011

Предполагая, что keyboard является объектом java.util.Scanner, проблема заключается в следующем.

Во-первых, вы читаете байт, используя nextByte(), поэтому в качестве входных данных принимается только значение байта. Остальные значения, здесь в вашем случае символ новой строки остается во входном потоке. Он читается keyboard.nextLine() как ввод и возвращается. Таким образом, пустая строка возвращается этой строкой. Таким образом, вы можете захотеть добавить дополнительный nextLine() вызов для сброса этой новой строки следующим образом:

System.out.print("Input the layout type: ");
keyboard.nextLine();
layoutType = keyboard.nextLine();
System.out.print("Input the layout name: ");
layoutName = keyboard.nextLine();
...