Scanner迴圈輸出時,無法跳出異常的問題分析
阿新 • • 發佈:2020-08-07
1.問題場景
在寫Scanner的時候發現一個有意思的問題,程式碼如下。
public static void main(String[] args) { System.out.println("···遊戲開始···"); Scanner scanner=new Scanner(System.in); for(;;){ try{ System.out.println("請輸入幸運數字:");int num=scanner.nextInt(); System.out.println("您的幸運數字是:"+num); break; }catch (Exception e){ System.out.println("輸入錯誤,請輸入幸運數字:"); continue; } } System.out.println("···遊戲結束···"); }
預期效果:如果輸入非數字後,在異常處理的跳出檔次迴圈,繼續輸入。
實際效果:輸入非數字後,觸發死迴圈,程式不再按照預期執行。
2.不懂就問
關於Scanner呼叫nextInt()異常try後不能二次輸入問題博主對於這個問題的解釋非常到位。
Scanner在要求使用者輸入的時候,其實是在記憶體中建立了一段空間用於使用者輸入,我們輸入的字母就會存入該段記憶體。
如果輸入的是非數字,當我們用sc.nextInt()呼叫時,就不能調用出來,因為它不是我們要呼叫的int型別,這時就會報輸入不匹配錯誤。
可是問題就在這兒,我們用sc.nextInt()呼叫沒把該段記憶體中的東西提出來,他就會一直佔用這段記憶體,導致我們二次輸入時,就不會再要求使用者輸入了,他會繼續試圖呼叫該段記憶體數值。
所以解決辦法就是我們清空該段記憶體,或者把該段記憶體中的數值取出。
所以我們在catch塊中使用 sc.next(); 就可以解決。
3.解決方式
方式一:
public static void main(String[] args) { System.out.println("···遊戲開始···"); Scanner scanner=new Scanner(System.in); for(;;){ try{ System.out.println("請輸入幸運數字:"); int num=scanner.nextInt(); System.out.println("您的幸運數字是:"+num); break; }catch (Exception e){ scanner.next();//檢視原始碼,清快取 System.out.println("輸入錯誤,請輸入幸運數字:"); continue; } } System.out.println("···遊戲結束···"); }
方拾二:
public static void main(String[] args) { System.out.println("···遊戲開始···"); Scanner scanner=new Scanner(System.in); for(;;){ try{ System.out.println("請輸入幸運數字:"); int num=Integer.valueOf(scanner.nextLine().trim()); System.out.println("您的幸運數字是:"+num); break; }catch (Exception e){ System.out.println("輸入錯誤,請輸入幸運數字:"); continue; } } System.out.println("···遊戲結束···"); }
4.總結
萬物皆物件,搞清Scanner的原始碼實現,問題就會迎刃而解。