Как исправить зацикливание из моего исключения catch? он зацикливается на количестве попыток вместо того, чтобы возвращаться к входу моего сканера

#java #for-loop #try-catch

Вопрос:

Как исправить зацикливание из моего исключения catch? он зацикливается на количестве попыток вместо того, чтобы возвращаться к входу моего сканера.

Я пытаюсь сделать игру в угадывание чисел на java с циклом for и пытаюсь поймать исключения для выполнения. Но проблема в том, что исключение syso продолжает зацикливаться само по себе.

Вот моя попытка:

 import java.util.*;

public class GuessingGame {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in);
        int cor = 1   (int)(50 * Math.random());
        int attempts = 20;  
        System.out.println("enter the number to guess from 1 - 50.");
        for (int i = 0; i < attempts; i  ) {            
            try {
                int ans = sc.nextInt();
                if (ans == cor) {
                    System.out.println("You got it for "  i  " attempts.");
                    break;
                } else if (ans > 50) {
                    System.err.println("Out of range.");
                    System.out.println("Enter the number to guess from 1 - 50.");
                } else if (ans < 0) {
                    System.err.println("Out of range.");
                    System.out.println("Enter the number to guess from 1 - 50.");
                } else if(ans < cor) {
                    System.out.println("Too low. try again.");
                } else if (ans > cor) {
                    System.out.println("Too high. Try again.");
                }
            } catch(Exception r) {
                System.err.println("Invalid");
            }
        }
    }
}
 

Вывод кода выглядит следующим образом:

 enter the number to guess from 1 - 50.
2
Too low. try again.
60
Enter the number to guess from 1 - 50.
Out of range.
23
Too high. Try again.
-20
Out of range.
Enter the number to guess from 1 - 50.
32
Too high. Try again.
a
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid
Invalid

 

Комментарии:

1. Ваш вызов nextInt завершается неудачно, потому что следующий токен во входном потоке не может быть преобразован в целое число. Следующий токен во входном потоке остается следующим токеном во входном потоке до тех пор, пока вы его явно не используете. Поместите вызов nextLine в обработчик исключений.

Ответ №1:

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

Однако я написал кое-что, что работает. Сначала я изменил ваш цикл » для «на цикл «пока».

Затем я разбил вашу проверку ввода на свой собственный метод. «Действительная стратегия». Здесь я объединил два ваших утверждения if в одно утверждение. Как только он будет подтвержден, его нужно будет сравнить с ответом.

    public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int cor = 1   (int) (50 * Math.random());
    int attempts = 20;
    int i = 0;
    System.out.println("enter the number to guess from 1 - 50.");

    while (i < attempts) {

        int guess = validateGuess(sc);

        if (guess != -1) {
            if (guess == cor) {
                System.out.println("You got it for "   i   " attempts.");
                break;
            } else if (guess < cor) {
                System.out.println("Too low. try again.");
            } else if (guess > cor) {
                System.out.println("Too high. Try again.");
            }
            i  ;
        }
    }
}

private static int validateGuess(Scanner scanner) {
    String input = scanner.nextLine();
    try {
        int i = Integer.parseInt(input);
        if (i >= 1 amp;amp; i <= 50) {
            return i;
        }else {
            System.out.println("Please try again. (1-50)");
        }
    }catch (InputMismatchException | NumberFormatException e) {
        if (input.equals("q")) {
            System.exit(0);
        }
        System.out.println("Please try again. (1-50)");
    }
    return -1;
}