亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

關于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入門第三季
  • 參與學習       409767    人
  • 解答問題       4543    個

Java中你必須懂得常用技能,不容錯過的精彩,快來加入吧

進入課程

關于ID輸入非整數異常處理問題

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號