Вывод блок кода два раза, не могу понять чего
У меня есть код, типа справочника, на самом деле фигня для практики, не важно. И почему-то выводится дважды текст, не могу понять.
Фото вывода: 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 шт):
Вы использовали 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'); }
Дополнительно: