0

Коллеги, добрый день, написал небольшой калькулятор, и мне нужно, чтоб Switch выполнялся в зависимости от того, какому тексту равна переменная action, но после комплияции консоль запрашивает 1-е число, 2-е число, и спрашивает чему будет равна переменная action, но не даёт ввести значение, а сразу заканчивает выполнение кода. Ниже прилагаю код:

import java.util.Scanner;

public class Switchcase {

public static void main (String[] args) { Scanner scan = new Scanner(System.in); System.out.print("Введите Ваше 1 число: "); int num1 = scan.nextInt(); System.out.print("Введите Ваше 2 число: "); int num2 = scan.nextInt(); System.out.print("Какое действие хотите совершить?: "); String action = scan.nextLine();

switch (action) {

    case "+":
        System.out.println("Результат - " + (num1 + num2) );
        break;
    case "-":
        System.out.println("Результат - " + (num1 - num2) );
        break;
    case "*":
        System.out.println("Результат - " + (num1 * num2) );
    break;
    case "/":
        if (num2 == 0) {
            System.out.println("Введите число отличное от нуля.");
        }
        System.out.println("Результат - " + (num1 / num2) );
        break;
    default:
        break;
}

}

}

В видеоуроке, по которому я обучаюсь, автор говорит, что в int num2 есть какой то скрытый символ, и он подставляется в String action, что это за символ, и что это за прикол?

int num2 = scan.nextInt();
System.out.print("Какое действие хотите совершить?: ");
String action = scan.nextLine();
SALUTE
  • 107
  • nextLine() читает до конца текущей строки (символа перевода строки или конца потока) и возвращает всё, что было в этой строке. nextInt() извлекает число и оставляет "\n" в буфере. nextLine() натыкается на \n и прекращает работу, прочитав 0 символов — пустую строку. Можно вызвать nextLine() дважды, чтобы поглотить этот перенос строки и ожидать новой строки https://qna.habr.com/q/269359 – Dmitry Kozlov Oct 26 '22 at 11:10
  • А почему nextInt() вводит \n в конце, а nextLine() этого не делает? – SALUTE Oct 26 '22 at 11:31
  • 2

2 Answers2

1

Когда вы вводите int num2 вы на клаиватуре нажимаете число и потом клавишу Enter. Клавиша Enter передает сканеру знак \n - перенос строки. И именно это значение записывается в вашу переменную action. Чтобы этого избежать, нужно "съесть" лишний символ перевода строки. Делается это вот так:

    Scanner scan = new Scanner(System.in);
    System.out.print("Введите Ваше 1 число: ");
    int num1 = scan.nextInt();
    System.out.print("Введите Ваше 2 число: ");
    int num2 = scan.nextInt();
    scan.nextLine(); // СЪЕСТЬ ЛИШНИЙ ЗНАК ПЕРЕНОСА СТРОКИ!!!!
    System.out.print("Какое действие хотите совершить?: ");
    String action = scan.nextLine();

Попробуйте так, и все заработает

had0uken
  • 1,560
  • 2
  • 4
  • 17
  • А почему в первом nextInt() \n автоматически не передаётся, а в последнем nextInt() передаётся? – SALUTE Oct 26 '22 at 11:33
  • Передается также. Получается следующая картина. Вы при первом int передаете число и знак переноса. И дальше снова пользуетесь методом nextInt() - он проигнорирует знак переноса, его интересует только число. Вы снова передаете число и знак переноса строки. А дальше вы уже используете метод не nextInt(), а nextLine() - а тут уже другое дело. Он знак переноса не проигнорирует, а запишет в вашу переменную – had0uken Oct 26 '22 at 11:35
  • Это особенность Java? Почему так? – SALUTE Oct 26 '22 at 14:31
  • Это особенность сканера. Он читает строку до конца. И если вконце строки стоит символ перевода строки, то он также будет включен в то, что вычитал сканер. – had0uken Oct 26 '22 at 14:45
  • А всё же, он же в ту же строку передает, а не в следующую свой \n, как тогда его следующая строка считывает? – SALUTE Oct 26 '22 at 14:48
  • Чтобы сориентироваться можно представить так: вы передаете в сканер "26 \n". nextInt() забирает себе 26, а \n "остается в сканере. В следующий раз вы передаете "48 \n". nextInt() забирает себе 48, а \n остается в сканере. Потом вы вызываете nextLine(), а в сканере уже висит \n с прошлого раза. И nextLine() забирает себе этот самый \n. Это если упростить – had0uken Oct 26 '22 at 16:39
  • Да, я понял Вас, спасибо) – SALUTE Oct 27 '22 at 06:08
0

Также решением вопроса является использование метода scan.next(); заместо scan.nextLine()

SALUTE
  • 107