1. 程式人生 > 實用技巧 >Scanner迴圈輸出時,無法跳出異常的問題分析

Scanner迴圈輸出時,無法跳出異常的問題分析

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的原始碼實現,問題就會迎刃而解。