關(guān)于ID輸入非整數(shù)異常處理問題
while(true){
try{
this.ID=sr1.nextInt();
break;
}
catch(Exception e){
System.out.println("輸入錯誤請重新輸入:");
continue;
}
}
這樣的話我輸入一個字母就會陷入死循環(huán)
輸入錯誤請重新輸入:
輸入錯誤請重新輸入:
輸入錯誤請重新輸入:
輸入錯誤請重新輸入 :
不停的死循環(huán)
但我從網(wǎng)上看了一個解決辦法:在catch語句中加了句String a=sr1.next();如下
while(true){
try{
this.ID=sr1.nextInt();
break;
}
catch(Exception e){
System.out.println("輸入錯誤請重新輸入:");
String a=sr1.next();
continue;
}
}
這樣就搞定了運行結(jié)果如下:
這是什么原理?求解
2016-11-12
這個問題我以前遇到過,你要在catch語句里面重置Scanner對象,所以,你只需要在catch語句里面加上雖然sr1 = new Scanner(System.in);就可以了。為什么要這樣子呢,因為如果不重置Scanner對象sc1將會總在while死循環(huán) try catch,原因是Scanner對象發(fā)生異常后就不能再被使用,所以一直報異常,編程了死循環(huán).
望采納,謝謝。
2017-04-05
是這個意思。我來總結(jié)一下,異常發(fā)生后,原緩沖區(qū)的錯誤字符不能加載到掃描器中以至停留在緩沖區(qū),第二次循環(huán)開始后,try中的str.next()方法又被調(diào)用,掃描器掃描到停留在緩沖區(qū)的錯誤字符,又捕捉到異常并執(zhí)行catch語句.....周而復(fù)始,這就是出現(xiàn)死循環(huán)的原因。對于這種情況,我們可以在第二次循環(huán)開始之前也就是catch語句塊中的continue之前重新創(chuàng)建一個掃描器對象清空緩沖區(qū)。
2016-11-28
原因不是Scanner發(fā)生異常后就不能再被使用了吧,否則為什么沒有new一個Scanner直接在catch語句中加了句String a=sr1.next()就OK了,其實是Scanner拋出異常后原本從鍵盤輸入的字符串還在輸入流中所以要String a=sr1.next()這條語句把字符串讀出來要不然直接到下一次循環(huán)this.ID=sr1.nextInt();它讀的還是剛剛的字符串然后就死循環(huán)