为了账号安全,请及时绑定邮箱和手机立即绑定

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

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://img1.sycdn.imooc.com//5825c0800001bfb306970688.jpg

这是什么原理?求解

正在回答

3 回答

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

望采纳,谢谢。

0 回复 有任何疑惑可以回复我~
#1

达文西H 提问者

非常感谢!
2016-11-13 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

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

1 回复 有任何疑惑可以回复我~
#1

慕粉4033208

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

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409788    人
  • 解答问题       4340    个

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

进入课程

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信