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;
}
}
这样就搞定了运行结果如下:
这是什么原理?求解
这个问题我以前遇到过,你要在catch语句里面重置Scanner对象,所以,你只需要在catch语句里面加上虽然sr1 = new Scanner(System.in);就可以了。为什么要这样子呢,因为如果不重置Scanner对象sc1将会总在while死循环 try catch,原因是Scanner对象发生异常后就不能再被使用,所以一直报异常,编程了死循环.
望采纳,谢谢。
是这个意思。我来总结一下,异常发生后,原缓冲区的错误字符不能加载到扫描器中以至停留在缓冲区,第二次循环开始后,try中的str.next()方法又被调用,扫描器扫描到停留在缓冲区的错误字符,又捕捉到异常并执行catch语句.....周而复始,这就是出现死循环的原因。对于这种情况,我们可以在第二次循环开始之前也就是catch语句块中的continue之前重新创建一个扫描器对象清空缓冲区。
原因不是Scanner发生异常后就不能再被使用了吧,否则为什么没有new一个Scanner直接在catch语句中加了句String a=sr1.next()就OK了,其实是Scanner抛出异常后原本从键盘输入的字符串还在输入流中所以要String a=sr1.next()这条语句把字符串读出来要不然直接到下一次循环this.ID=sr1.nextInt();它读的还是刚刚的字符串然后就死循环