Java Do While 语句在 Try Catch 语句之后无限循环

Java Do While statement looping infinitely after Try Catch statement

我目前正在 Eclipse 中编写一些 Java 代码,并尝试在 do-while 语句中使用 try-catch 语句。我目前的代码如下:

import java.util.Scanner;
import java.util.InputMismatchException;
import java.util.Random;
public class GG_HighLowInvalid{

    public static void main(String[] args){

        Scanner cg = new Scanner(System.in);

        //Assign and define variables
        int guess, rand;
        guess = 0;
        rand = 10;

        //Create loop
        do 
            try{
                guess = 0;
                //Ask for a guess
                System.out.print("Enter your guess: ");

                //Record the guess
                guess = cg.nextInt();
            }
            catch(InputMismatchException exception){

                System.out.println("Your guess must be an integer.");

            }
        while  (guess != rand);


    }
}

当我输入任何数字时,代码工作正常并且会循环请求另一个输入,当输入 10 时,代码会按预期停止(因为 guess 变得等于 rand)。但是,如果我输入任何非整数的值(例如 "No"),就会出现无限循环,输出如下:

"Your guess must be and integer."

"Enter your Guess: Your guess must be an integer."

"Enter your Guess: Your guess must be an integer."

"Enter your Guess: Your guess must be an integer."

一直重复直到程序被外部终止。

既然while语句是(guess != rand),为什么非整数会导致死循环? try语句下的手动输入不应该再调用一次吗?任何有助于理解这一点的帮助将不胜感激。另外,我是 Java 的新手,如果遇到简单的问题,请提前致歉。

When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method.

目前,您的 Scanner 没有继续读取下一个输入,而是连续读取相同的输入。您必须显式调用一些方法来读取这个不 预期 的不正确值。例如,scanner.next() catch块中调用可以避免这种死循环。

您不需要使用 try catch 语句。您只需使用对象扫描器的 hasNextInt() 方法检查它是否为整数。这是一个示例,它将解决您的问题:

public static void main(String[] args) {
    Scanner cg = new Scanner(System.in);
    boolean valid = false;
    //Assign and define variables
    int guess, rand;
    guess = 0;
    rand = 10;

    //Create loop
    do{
        System.out.println("Enter your guess: ");
        if(cg.hasNextInt()){
            guess = cg.nextInt();  
            valid = true;
        }else{
            System.out.println("Your guess must be an integer.");
            cg.next();
        }
    }while  (!valid || guess != rand);
}

使用以下代码:

       catch(InputMismatchException exception){
                cg.next();
                System.out.println("Your guess must be an integer.");

       }

在您读取缓冲区失败后,它的值不会被清空,下次当它到达 cg.nextInt() 时,它会尝试读取相同的 wrong value,然后您进入循环。您需要 "to empty buffer",所以下次它会读取正确的值。

尝试在 catch 块中重置变量 "guess = 0"。