首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Scanner 深度解析:next() 與 nextLine() 差異與坑點完全指南

     編輯:Java 相關知識

java.util.Scanner 是 Java 處理標準輸入最常用的工具類,但 next() 與 nextLine() 的行為差異是無數初學者的「細思極恐」坑點。本文從原理、現象、代碼驗證到最佳實踐,徹底講透這對「雙胞胎」方法。

核心差異一覽

特性next()nextLine()
結束符空白字元(空格、Tab、換行)僅換行符(Enter)
前導空白自動跳過不跳過,包含在結果中
能否讀取含空格字串不能能
緩衝區殘留留下結束符(換行)在緩衝區消耗換行符,指標移至下一行

為什麼會發生「跳過輸入」現象?

Scanner sc = new Scanner(System.in);
String s1 = sc.next();      // 輸入 "home" + Enter
String s2 = sc.nextLine();  // 期望輸入第二行,實際直接讀到空字串

過程解析:

  1. next() 讀取 home,遇到 Enter 停止,但 Enter 留在緩衝區。
  2. nextLine() 讀取緩衝區剩餘內容,遇到 Enter 立即結束,返回空字串 ""。
  3. 導致程式邏輯錯誤,使用者無法輸入第二行。

同類方法同樣受影響

nextInt()、nextDouble()、nextFloat()、nextLong() 等所有 nextXxx() 方法,結束符皆為空白字元,**同樣會殘留換行符**。

標準解決方案:消耗殘留換行符

在每個 nextXxx() 後緊接一個 sc.nextLine() 清空緩衝區。

Scanner sc = new Scanner(System.in);

System.out.print("請輸入數量:");
int num = sc.nextInt();
sc.nextLine(); // 【關鍵】消耗殘留換行符

String[] names = new String[num];
for (int i = 0; i < num; i++) {
    System.out.print("請輸入第 " + (i+1) + " 個名字:");
    names[i] = sc.nextLine(); // 正確讀取整行(含空格)
}

進階建議:統一使用 nextLine() + 手動解析

避免混用帶來的認知負擔,採用「全行讀取 + 字串分割/轉型」模式:

Scanner sc = new Scanner(System.in);
System.out.print("請輸入數字(空格分隔):");
String line = sc.nextLine(); // 讀整行
String[] parts = line.trim().split("\\s+");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1]);

優點:邏輯清晰、無殘留問題、易於擴展驗證(如檢查輸入個數、格式)。

原理補充:Scanner 內部緩衝機制

  • Scanner 維護一個輸入緩衝區,next() 使用「分隔符模式」(預設 \\p{javaWhitespace}+)匹配 token。
  • nextLine() 尋找行分隔符(\\r\\n|\\n|\\r),返回分隔符之前的內容(不含分隔符)。
  • 當 next() 結束時,分隔符(含換行)**未被消耗**,導致後續 nextLine() 直接匹配到空行。

掌握 next() 與 nextLine() 的邊界行為,是 Java 控制台程式穩健的關鍵。記住口訣:「next 留換行,nextLine 吃換行;混用必補行,統一用 nextLine 最安心」。

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