为什么异常处理产生死循环

时间:2021-12-24 23:51:18
import java.util.*;

public class RandomNum {

public static void main(String[] args) {
Random random = new Random();
Scanner sc = new Scanner(System.in);
int guess = 0;
int guessNum = 0;
String again = null;
do {
guess = random.nextInt(100);
do {
try {
System.out.println("请输入您猜到的数字:");
guessNum = sc.nextInt();
if (guessNum == guess) {
System.out.println("恭喜!猜对了!");
break;
} else if (guessNum > guess) {
System.out.println("大了!");
} else {
System.out.println("小了!");
}
} catch (InputMismatchException e) {
System.out.println("请输入正确格式的数字!");
}
} while (true);
System.out.println("again?(y/n)");
again = sc.next();
if (again.equals("n")) {
System.out.println("End of program.");
break;
}
} while (true);

}

}


上面这段代码,在我输入错误的数字格式时捕获异常,比如我输入“21f”,它捕获异常,然后打印"请输入正确格式的数字!",打印完了过后继续执行循环,打印那句:"请输入您猜到的数字:",接下来应该等待我输入啊,可是JVM好像直接把我上一次输入的“21f”作为结果,又开始处理异常,然后这样一直循环。。。
为什么会出现这种情况?能不能麻烦大家给我解释稍微细一点,我是新手。谢谢!

8 个解决方案

#1


 catch (InputMismatchException e) {
                    sc.nextLine();
                    System.out.println("请输入正确格式的数字!");
                }

#2


引用 1 楼 gukuitian 的回复:
Java code
 catch (InputMismatchException e) {
                    sc.nextLine();
                    System.out.println("请输入正确格式的数字!");
                }

我想问的是为什么JVM会把我上次输入的21f这个不合法的字符串当做我这次输入的,继续捕获异常?然后就这样一直捕获一直处理一直循环?

#3


喜欢用UI。。。。。

#4


那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

#5


引用 4 楼 cowboyhn 的回复:
那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

+1
scanner问题

#6


 } while (true);
这里true 不是一直循环

#7


引用 4 楼 cowboyhn 的回复:
那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

高手啊!非常感谢!

#8


应该是Scanner对象的问题,在try中重新new一下就行了

#1


 catch (InputMismatchException e) {
                    sc.nextLine();
                    System.out.println("请输入正确格式的数字!");
                }

#2


引用 1 楼 gukuitian 的回复:
Java code
 catch (InputMismatchException e) {
                    sc.nextLine();
                    System.out.println("请输入正确格式的数字!");
                }

我想问的是为什么JVM会把我上次输入的21f这个不合法的字符串当做我这次输入的,继续捕获异常?然后就这样一直捕获一直处理一直循环?

#3


喜欢用UI。。。。。

#4


那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

#5


引用 4 楼 cowboyhn 的回复:
那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

+1
scanner问题

#6


 } while (true);
这里true 不是一直循环

#7


引用 4 楼 cowboyhn 的回复:
那是由于出现异常时,还继续保留着输入缓冲中的数据,所以你得先把错误的数据读取出来,然后再等待下一次输入。

高手啊!非常感谢!

#8


应该是Scanner对象的问题,在try中重新new一下就行了