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

时间:2015-09-19 10:01:20

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

我目前正在研究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时,代码停止,因为它应该停止(因为猜测变得等于兰特)。但是,如果我输入任何不是整数的东西(例如" No"),则会在输出打印以下内容时出现无限循环:

"你的猜测必须是整数。"

"输入您的猜测:您的猜测必须是整数。"

"输入您的猜测:您的猜测必须是整数。"

"输入您的猜测:您的猜测必须是整数。"

永远重复,直到程序外部终止。

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

4 个答案:

答案 0 :(得分:4)

  

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

目前,您的Scanner没有继续阅读下一个输入但是连续阅读相同的内容。您必须显式调用某些方法,这些方法可以读取不正确的值 expect 。例如,scanner.next()块中的catch 调用可以避免此无限循环。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用以下代码:

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

       }

读取缓冲区失败后,其值不会被清空,下次cg.nextInt()它尝试读取相同的wrong value时,您就会循环播放。你需要"清空缓冲区",所以下次它会读取正确的值。

答案 3 :(得分:-2)

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