Java, а бесконечно l oop при использовании сканера - PullRequest
0 голосов
/ 10 января 2020

Я хочу попросить пользователя ввести строку и четыре целочисленных значения, и я хочу, чтобы программа продолжала спрашивать пользователя о целочисленном значении, если пользователь вводит несоответствие типов, почему код продолжает работать бесконечно и никогда не ждет пользовательский ввод, если пользователь ввел неправильный тип?

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv, breakInterv, terminalBreakInterv;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    while (true) {
        try {
            System.out.println("Please, Enter the Pomodoro interval: ");
            pomoInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }

    }
    while (true) {
        try {
            System.out.println("Please, Enter the break interval: ");
            breakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }

    }
    while (true){
        try {
            System.out.println("Please, Enter the terminal break interval ");
            terminalBreakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            System.out.println(ex.getMessage());
        }
    }
    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

}
}

Ответы [ 4 ]

0 голосов
/ 10 января 2020

Согласно сканеру oracle документы: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

Когда сканер генерирует исключение InputMismatchException, сканер не пропустит токен, вызвавший исключение, так что это может быть извлекается или пропускается другим способом попытался прочитать снова и снова один и тот же токен.

Чтобы решить эту проблему, вы можете либо изменить l oop, либо использовать метод hasNextInt (), либо использовать scanner.next () в блоке перехвата, чтобы сканер может перейти к следующему токену.

0 голосов
/ 10 января 2020

Я всегда использую do-while l oop при проверке правильности ввода от пользователя.

Проверьте, работает ли следующее:

    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv = -1, breakInterv = -1, terminalBreakInterv = -1;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    boolean isPomoInterv = false;
    do {
        System.out.println("Please, Enter the Pomodoro interval: ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                pomoInterv = Integer.parseInt(temp);
                isPomoInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isPomoInterv);

    boolean isBreakInterv = false;
    do {
        System.out.println("Please, Enter the break interval: ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                breakInterv = Integer.parseInt(temp);
                isBreakInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isBreakInterv);

    boolean isTerminalBreakInterv = false;
    do {
        System.out.println("Please, Enter the terminal break interval ");
        String temp = scanner.nextLine();
        try {
            if (Integer.parseInt(temp) > 0) {
                terminalBreakInterv = Integer.parseInt(temp);
                isTerminalBreakInterv = true;
            }
        } catch (NumberFormatException e) {
            System.out.println("Try again");
        }

    } while (!isTerminalBreakInterv);

    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

Комментарий на ваш вопрос страшно-вомбат правильно. я использовал его комментарий для кодирования выше.

0 голосов
/ 10 января 2020

Я действительно решил это, мне просто нужно было добавить (scanner.next ();) в оператор catch, как показано ниже, потому что, как работает класс Scanner, см. Код ниже,

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String sessionName;
    int pomoInterv, breakInterv, terminalBreakInterv;
    System.out.println("Please, Enter the session name: ");
    sessionName = scanner.nextLine();
    while (true) {
        try {
            System.out.println("Please, Enter the Pomodoro interval: ");
            pomoInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }

    }
    while (true) {
        try {
            System.out.println("Please, Enter the break interval: ");
            breakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }

    }
    while (true){
        try {
            System.out.println("Please, Enter the terminal break interval ");
            terminalBreakInterv = scanner.nextInt();
            break;
        } catch (InputMismatchException ex) {
            scanner.next();
            System.out.println(ex.getMessage());
        }
    }
    System.out.println("Done!");
    System.out.println(sessionName);
    System.out.println(pomoInterv);
    System.out.println(breakInterv);
    System.out.println(terminalBreakInterv);

}
}

проверьте этот ответ { ссылка }

0 голосов
/ 10 января 2020

Потому что у вас нет break; в блоке catch. Когда есть исключение, вы распечатываете сообщение. Но как только он выходит из блока catch, в то время как l oop все еще удовлетворяет своему условию и выполняется снова. Попробуйте добавить break; внутри блока catch.

...