【问题标题】:Java Do While statement looping infinitely after Try Catch statement [duplicate]Java Do While 语句在 Try Catch 语句后无限循环[重复]
【发布时间】:2015-09-19 10:01:20
【问题描述】:

我目前正在 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”),则会出现无限循环,输出会打印以下内容:

“你的猜测一定是整数。”

“输入你的猜测:你的猜测必须是整数。”

“输入你的猜测:你的猜测必须是整数。”

“输入你的猜测:你的猜测必须是整数。”

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

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

【问题讨论】:

  • while 条件对guessrand 进行评估时,您是否尝试过使用调试器查看它的值?
  • 输入非整数这一事实不会影响guessint 的事实,其值为0(或您的最新猜测值之一)。因此,guess != rand 之前保持不变。然而,真正的问题是Scanner 对象一直在读取相同的输入而不要求新的输入。 @TAsk 的回答解决了这个问题。

标签: java eclipse try-catch infinite-loop do-while


【解决方案1】:

当扫描器抛出 InputMismatchException 时,扫描器不会 传递导致异常的令牌,以便可以检索它 或通过其他方法跳过。

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

【讨论】:

  • 谢谢,这对我有很大帮助,因为我不知道扫描仪会以这种方式工作!我会在 5 分钟后回来,当我可以接受答案并确保将您的答案标记为正确时。
  • @ScottT 如果您遇到问题,建议学习相关类的 Javadoc。这是为Scanner 记录的
【解决方案2】:

使用以下代码:

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

       }

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

【讨论】:

    【解决方案3】:

    您不需要使用 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);
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        相关资源
        最近更新 更多