Делай пока бесконечный цикл - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь написать метод, который запрашивает у пользователя положительное целое число. Если положительное целое число не введено, будет выведено сообщение «Пожалуйста, введите положительное значение». Эта часть не проблема. Проблема заключается в том, что когда я пытаюсь реализовать оператор try catch, который перехватывает InputMismatchExceptions (в случае, если пользователь вводит символ или строку случайно), цикл запускается бесконечно и выдает сообщение об ошибке, связанное с InputMistmatchException.

Вот мой код:

private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                while (true) {
                    variable = scanner.nextInt();
                    if (variable < 0) {
                        System.out.println("Please enter a positive value");
                    } else if (variable >= 0) {
                        break;
                    }
                }
                properValue = true;
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
            }
        } while (properValue == false);
        return variable;
    } 

Ответы [ 5 ]

0 голосов
/ 02 сентября 2018

Это действительно почти идентично SO: обработка исключений Java Scanner

Два выпуска:

  • Вам нужен scanner.next(); в вашем обработчике исключений

    ... AND ...

  • Вам на самом деле не нужны две петли. Один цикл будет хорошо работать:

    private static int nonNegativeInt(){
        boolean properValue = false;
        int variable = 0;
        do {
            try {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                    continue;
                 } else if (variable >= 0) {
                    properValue = true;
                 }
            } catch (InputMismatchException e){
                System.out.println("That is not a valid value.");
                scanner.next();
            }
        } while (properValue == false);
        return variable;
    } 
    
0 голосов
/ 02 сентября 2018

Вы можете объявить сканер в начале цикла do-while, поэтому nextInt () не будет выдавать исключение снова и снова.

private static int nonNegativeInt(){
    boolean properValue = false;
    int variable = 0;
    do {
        scanner = new Scanner(System.in);
        try {
            while (true) {
                variable = scanner.nextInt();
                if (variable < 0) {
                    System.out.println("Please enter a positive value");
                } else if (variable >= 0) {
                    break;
                }
            }
            properValue = true;
        } catch (InputMismatchException e){
            System.out.println("That is not a valid value.");
        }
    } while (properValue == false);
    return variable;
} 
0 голосов
/ 02 сентября 2018

Просто добавьте оператор break в ваш улов.
Кстати, вы можете избавиться от цикла while, переписав его так:

try {
    variable = scanner.nextInt();
    if (variable < 0) {
        System.out.println("Please enter a positive value");
    } else {
        properValue = true;
    }
}
//... 
0 голосов
/ 02 сентября 2018

По сути, происходит то, что сканер сталкивается с ошибкой, когда данный токен недействителен, поэтому он не может пройти дальше этого значения. Когда следующая итерация запускается снова, scanner.nextInt () снова пытается просканировать следующее входное значение, которое все еще является недопустимым, поскольку оно там никогда не проходило.

Что вы хотите сделать, это добавить строку

scanner.next(); 

в вашем предложении catch, по сути, пропустить этот токен.

Примечание: Ваш метод в общем неоправдан. Вы можете сократить это в этом.

private static int nonNegativeInt() {
    int value = 0;
    while (true) {
        try {
            if ((value = scanner.nextInt()) >= 0)
                return value;
            System.out.println("Please enter a positive number");
        } catch (InputMismatchException e) {
            System.out.println("That is not a valid value");
            scanner.next();
        }
    }
}
0 голосов
/ 02 сентября 2018

вы перехватываете исключение, но не изменяете значение правильного значения переменной, поэтому оператор catch выполняется вечно. Добавление properValue = true; или даже break оператора внутри оператора catch дает вам необходимую функциональность!

Надеюсь, я помог!

...