關于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;
}
}
這樣就搞定了運行結果如下:
這是什么原理?求解
2016-11-12
這個問題我以前遇到過,你要在catch語句里面重置Scanner對象,所以,你只需要在catch語句里面加上雖然sr1 = new Scanner(System.in);就可以了。為什么要這樣子呢,因為如果不重置Scanner對象sc1將會總在while死循環 try catch,原因是Scanner對象發生異常后就不能再被使用,所以一直報異常,編程了死循環.
望采納,謝謝。
2017-04-05
是這個意思。我來總結一下,異常發生后,原緩沖區的錯誤字符不能加載到掃描器中以至停留在緩沖區,第二次循環開始后,try中的str.next()方法又被調用,掃描器掃描到停留在緩沖區的錯誤字符,又捕捉到異常并執行catch語句.....周而復始,這就是出現死循環的原因。對于這種情況,我們可以在第二次循環開始之前也就是catch語句塊中的continue之前重新創建一個掃描器對象清空緩沖區。
2016-11-28
原因不是Scanner發生異常后就不能再被使用了吧,否則為什么沒有new一個Scanner直接在catch語句中加了句String a=sr1.next()就OK了,其實是Scanner拋出異常后原本從鍵盤輸入的字符串還在輸入流中所以要String a=sr1.next()這條語句把字符串讀出來要不然直接到下一次循環this.ID=sr1.nextInt();它讀的還是剛剛的字符串然后就死循環