关于ID输入非整数异常处理问题

来源:7-1 简易扑克牌游戏

达文西H

2016-11-11 20:59

while(true){
try{
this.ID=sr1.nextInt();
break;
}
catch(Exception e){
System.out.println("输入错误请重新输入:");
continue;
}
}

这样的话我输入一个字母就会陷入死循环

输入错误请重新输入:
输入错误请重新输入:
输入错误请重新输入:
输入错误请重新输入 :
不停的死循环

但我从网上看了一个解决办法:在catch语句中加了句String a=sr1.next();如下

while(true){
try{
this.ID=sr1.nextInt();
break;
}
catch(Exception e){
System.out.println("输入错误请重新输入:");
String a=sr1.next();
continue;
}
}

这样就搞定了运行结果如下:

http://img.mukewang.com/5825c0800001bfb306970688.jpg

这是什么原理?求解

写回答 关注

3回答

  • KeT
    2016-11-12 00:44:55
    已采纳

    这个问题我以前遇到过,你要在catch语句里面重置Scanner对象,所以,你只需要在catch语句里面加上虽然sr1 = new Scanner(System.in);就可以了。为什么要这样子呢,因为如果不重置Scanner对象sc1将会总在while死循环 try catch,原因是Scanner对象发生异常后就不能再被使用,所以一直报异常,编程了死循环.

    望采纳,谢谢。

    达文西H

    非常感谢!

    2016-11-13 09:55:20

    共 1 条回复 >

  • 慕粉4033208
    2017-04-05 02:38:53

    是这个意思。我来总结一下,异常发生后,原缓冲区的错误字符不能加载到扫描器中以至停留在缓冲区,第二次循环开始后,try中的str.next()方法又被调用,扫描器扫描到停留在缓冲区的错误字符,又捕捉到异常并执行catch语句.....周而复始,这就是出现死循环的原因。对于这种情况,我们可以在第二次循环开始之前也就是catch语句块中的continue之前重新创建一个扫描器对象清空缓冲区。

  • winterfelll
    2016-11-28 21:42:15

    原因不是Scanner发生异常后就不能再被使用了吧,否则为什么没有new一个Scanner直接在catch语句中加了句String a=sr1.next()就OK了,其实是Scanner抛出异常后原本从键盘输入的字符串还在输入流中所以要String a=sr1.next()这条语句把字符串读出来要不然直接到下一次循环this.ID=sr1.nextInt();它读的还是刚刚的字符串然后就死循环

    慕粉4033...

    是这个意思。我来总结一下,异常发生后,原缓冲区的错误字符不能加载到扫描器中以至停留在缓冲区,第二次循环开始后,try中的str.next()方法又被调用,扫描器扫描到停留在缓冲区的错误字符,又捕捉到异常并执行catch语句.....周而复始,这就是出现死循环的原因。对于这种情况,我们可以在第二次循环开始之前也就是catch语句块中的continue之前重新创建一个扫描器对象清空缓冲区。

    2017-04-05 02:38:20

    共 1 条回复 >

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409784 学习 · 4339 问题

查看课程

相似问题