首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Scanner 輸入驗證:為什麼 catch 區塊需要 sc.next() 清除緩衝區

     編輯:程式設計綜合問答

程式碼片段


while (true) {
    try {
        age = sc.nextInt();
        if (age > 0 && age < 150) break;
        System.out.println("請重新輸入年齡");
    } catch (Exception e) {
        System.out.println("請重新輸入年齡");
        sc.next(); // 關鍵行
    }
}

為什麼需要 sc.next()?

Scanner.nextInt() **不消耗非整數輸入**。當使用者輸入 abc:

  1. nextInt() 拋出 InputMismatchException。
  2. 緩衝區內**仍殘留 abc**。
  3. 若不清除,下一次迴圈 nextInt() 讀到同樣 abc,**無限迴圈**拋出例外。

sc.next() 讀取並**丟棄下一個 token (以空白分隔)**,清除非法輸入,使迴圈能等待新輸入。

更佳寫法:hasNextInt() 預檢


while (true) {
    System.out.print("請輸入年齡 (1-149): ");
    if (sc.hasNextInt()) {
        int age = sc.nextInt();
        if (age > 0 && age < 150) {
            System.out.println("輸入有效: " + age);
            break;
        }
        System.out.println("年齡超出範圍");
    } else {
        System.out.println("非數字輸入: " + sc.next()); // 同時清除並提示
    }
}

關鍵差異

方法行為適用場景
nextInt()解析整數,失敗拋例外、不消耗 token確定輸入合法時
hasNextInt()預檢下一 token 是否整數,不消耗輸入驗證迴圈
next()讀取並消耗下一 token (字串)清除緩衝區、讀取字串
nextLine()讀取整行 (含空白)讀取含空格字串

常見陷阱

  • nextInt() 後緩衝區殘留換行符,後續 nextLine() 讀到空行 → 需額外呼叫 nextLine() 清除。
  • 混用 next()/nextLine() 需理解分隔符差異。

理解 Scanner 緩衝區與 token 機制,改用 hasNextX() 預檢模式,即能撰寫健壯的互動式輸入驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved