JAVA Я не понимаю Попробуйте поймать

Я здесь впервые. Я начинаю учиться кодировать, поэтому я искренне надеюсь, что этот вопрос, который у меня есть, не то, что я могу найти здесь! (обещаю, что искал некоторое время, но так как я нуб в этой теме, я не нашел ничего понятного для меня, чтобы разрешить мое сомнение).

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

Сама программа работает нормально, если вы вводите только числа, но я хочу добавить оператор try-catch для обработки неверного пользовательского ввода.

Я попытался использовать оператор, как показано в моем коде, но я не могу понять, почему он не работает должным образом, потому что, когда я ввожу что-то отличное от числа, исключение перехватывается, и оно печатает на консоли System.out.println( ), но программа завершается, когда это происходит.

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

Большое спасибо за твою помощь!

import java.util.Scanner;

public class HiLo {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);  //Creates Scanner object to read from keyboard
        String playAgain = "";  //if == y, game restarts
        try {
            do {
                // Create a random number for the user to guess
                int theNumber = (int)(Math.random() * 100 + 1);
                //System.out.println(theNumber);        //Uncoment this in case we want to know the number (for testing).
                int guess = 0;  //Number entered by the player
                int count = 0;  //Number of tries of guessing the number
                while(guess != theNumber){
                    System.out.println("Guess a number between 1 and 100:");
                    guess = scan.nextInt(); //Reads the number typed on the keyboard by the player
                    count++;    //Plus 1 every time a number is entered
                    System.out.println("You entered " + guess +".");
                    if(guess < theNumber) { //If number entered is smaller
                        System.out.println("The number is bigger" + ", try again!");
                        System.out.println("Number of tries: " + count);
                    } else if(guess > theNumber) { //If number entered is bigger
                        System.out.println("The number is smaller" + ", try again!");
                        System.out.println("Number of tries: " + count);
                    } else {    //If both previous cases are false
                        System.out.println("Congratulations! You've found the number!");
                    }
                }
                //Once guess == theNumber
                System.out.println("Number of tries: " + count);
                System.out.println("Play again? (y/n)");
                playAgain = scan.next();    //Reads the String entered from keyboard by the player
            }
            while(playAgain.equalsIgnoreCase("y"));     //If player enters y, start again.
            //Otherwise
            System.out.println("Thank you for playing! Goodbye :)");
        } catch (Exception e) {
            System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
        }
        scan.close();   //Close scanner
    }   //Close main
}   //Close class

person Vicentequesada    schedule 01.12.2017    source источник
comment
Программа завершается, потому что после вашего catch вы закрываете сканер и возвращаетесь из основного, так чего вы ожидали?   -  person tkausl    schedule 01.12.2017
comment
Тогда как я могу это исправить? Если я изменю структуру оператора do-while, в eclipse появится ошибка, и я не смогу скомпилировать. Я думал о добавлении Guess = scan.nextInt() после System.out.println(), но не работает.   -  person Vicentequesada    schedule 01.12.2017


Ответы (2)


поместите try-catch внутрь цикла while и повторно создайте объект сканера (scan = new Scanner(System.in) внутри блока catch.

while (guess != theNumber) {
                    try {                       
                        System.out.println("Guess a number between 1 and 100:");
                        guess = scan.nextInt(); // Reads the number typed on the
                        // keyboard by the player
                        count++; // Plus 1 every time a number is entered
                        System.out.println("You entered " + guess + ".");
                        if (guess < theNumber) { // If number entered is smaller
                            System.out.println("The number is bigger" + ", try again!");
                            System.out.println("Number of tries: " + count);
                        } else if (guess > theNumber) { // If number entered is
                            // bigger
                            System.out.println("The number is smaller" + ", try again!");
                            System.out.println("Number of tries: " + count);
                        } else { // If both previous cases are false
                            System.out.println("Congratulations! You've found the number!");
                        }
                    } catch (Exception e) {
                        System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
                        scan = new Scanner(System.in);
                    }
                }
person Barr3l3y3    schedule 01.12.2017
comment
Большой! Работает как шарм! Большое спасибо! У меня остался один вопрос: зачем создавать еще один объект сканера? Я не совсем понимаю, можете ли вы объяснить мне это, чтобы я мог научиться? Спасибо за ваше время!! - person Vicentequesada; 01.12.2017
comment
Еще один комментарий, мне нужен еще один объект сканера, чтобы он работал идеально, но я не уверен, почему, хахаха. Если бы вы могли объяснить, это было бы здорово! :D Спасибо! - person Vicentequesada; 01.12.2017
comment
scan.nextInt() будет выполняться первым, и только потом он присваивает входное значение переменной предположения. Ввод не int приведет к тому, что scan.nextInt() выдаст исключение. В то время как цикл scan.nextInt() продолжает выдавать исключение, потому что он содержит ввод, отличный от int. Это вызовет бесконечный цикл. Чтобы решить эту проблему, нам нужно убедиться, что объект сканера не содержит входного значения, отличного от int. Один из способов сделать это — создать новый объект Scanner в блоке catch. - person Barr3l3y3; 01.12.2017
comment
Спасибо большое за вашу помощь! С Уважением! - person Vicentequesada; 01.12.2017

Вам нужно понять работу блока try-catch. Вам не нужно окружать весь код внутри try. Просто поместите ту часть кода, которая вызывает исключение. Итак, в вашем случае просто окружите guess = scan.nextInt(); попыткой, а затем поймайте исключение. Потому что здесь этот оператор вызывает исключение, когда ввод не является целым числом. Таким образом, вы можете гарантировать, что пользовательский ввод действителен для каждой итерации цикла while(guess != theNumber).

Edit_1: я удалил блоки try-catch из вашего кода и добавил следующее, и у меня все работает нормально:

try{
  guess = scan.nextInt();} //Reads the number typed on the keyboard by the player
catch (InputMismatchException e){
  System.out.println("Incorrect entering! Please enter a number between 1 and 100.");
  scan.nextLine();
  continue;
}
person Vineet Bhat    schedule 01.12.2017
comment
Да, я думал, что это может быть решением, но когда я попытался, программа завершилась, потому что условие while всегда ложно, если вы вводите слово (например):/ - person Vicentequesada; 01.12.2017
comment
Вам нужно будет добавить scan.nextLine() в блок catch, чтобы иметь возможность использовать это. Я отредактировал свой ответ, чтобы показать, что я имею в виду. - person Vineet Bhat; 01.12.2017
comment
Почему вы используете оператор continue там? - person Vicentequesada; 01.12.2017
comment
Потому что, когда guess недействителен, я не хочу продолжать цикл, т. е. я не хочу, чтобы count++ и операторы после этого выполнялись. Вместо этого я хочу, чтобы началась следующая итерация цикла. - person Vineet Bhat; 02.12.2017