Вывод блок кода два раза, не могу понять чего

У меня есть код, типа справочника, на самом деле фигня для практики, не важно. И почему-то выводится дважды текст, не могу понять.

Фото вывода: click

import java.io.IOException;

class Help{
    static void dovidka() throws IOException {
        char x;
        do {
            System.out.println("Введите цифру, которая соответствует нужной информации");
            System.out.println("Введите \"q\" для выхода из программы.");
            System.out.println("1. if");
            System.out.println("2. while");
            System.out.println("3. for");
            x = (char) System.in.read();
            switch (x) {
                case 'q':
                    System.out.println("Выходим из программы");
                    break;
                case '1':
                    System.out.println("Возможно, будет инфа про if" + "\n");
                    break;
                case '2':
                    System.out.println("Возможно, будет инфа про while" + "\n");
                    break;
                case '3':
                    System.out.println("Возможно, будет инфа про for" + "\n");
                    break;
            }
        } while (x != 'q');
    }
}

public class example{
    public static void main(String[] args) throws IOException {
        Help.dovidka();
    }
}

Ответы (1 шт):

Автор решения: am233dmg

Вы использовали x = (char) System.in.read();, метод read() считывает данные побайтно(один байт за раз). Теперь вы запускаете свою программу, вводите например 1 и нажимаете enter, и этот enter отображается в \n, получается вы ввели и 1 и \n.

Разберем цикл:

  • Ввели 1

  • считали 1 x = (char) System.in.read();

  • попал по switch case в свой блок кода

  • вывел System.out.println("Возможно, будет инфа про if" + "\n");

  • падаем до низа в пост условие while (x != 'q'), получается ('1'!= 'q') это true

  • цикл повторяется

  • цикл повторяется, выводится информация

             System.out.println("Введите цифру, которая соответствует нужной информации");
             System.out.println("Введите \"q\" для выхода из программы.");
             System.out.println("1. if");
             System.out.println("2. while");
             System.out.println("3. for");
    
  • так как вы ввели 1 и enter, то после единицы идет \n, поэтому метод read() считывает \n и пропускает процесс ввода информации с консоли, потому что у него есть что читать, еще с прошлого раза и это символ \n

  • далее смотрим по switch case, а у нас нету case, удовлетворяющий \n потом мы падаем до низа в пост условие while (x != 'q'), получается ('\n'!= 'q') это true

  • цикл повторяется, поэтому у вас опять выводится информация

             System.out.println("Введите цифру, которая соответствует нужной информации");
             System.out.println("Введите \"q\" для выхода из программы.");
             System.out.println("1. if");
             System.out.println("2. while");
             System.out.println("3. for");
    

Можно использовать Scanner:

  • при считывании данных, он делит их на части, по какому-то патерну (по умолчанию Pattern WHITESPACE_PATTERN = Pattern.compile("\\p{javaWhitespace}+"), можете сами задать патерн) с помощью регулярного выражения и считывает int:

     static void dovidka() throws IOException {
             char x;
             Scanner scanner = new Scanner(System.in);
             do {
                 System.out.println("Введите цифру, которая соответствует нужной информации");
                 System.out.println("Введите \"q\" для выхода из программы.");
                 System.out.println("1. if");
                 System.out.println("2. while");
                 System.out.println("3. for");
                 x = (char) scanner.nextInt();
                 switch (x) {
                     case 'q':
                         System.out.println("Выходим из программы");
                         break;
                     case '1':
                         System.out.println("Возможно, будет инфа про if" + "\n");
                         break;
                     case '2':
                         System.out.println("Возможно, будет инфа про while" + "\n");
                         break;
                     case '3':
                         System.out.println("Возможно, будет инфа про for" + "\n");
                         break;
                 }
             } while (x != 'q');
         }
    

Дополнительно:

→ Ссылка