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(); // 期望輸入第二行,實際直接讀到空字串
過程解析:
next() 讀取 home,遇到 Enter 停止,但 Enter 留在緩衝區。nextLine() 讀取緩衝區剩餘內容,遇到 Enter 立即結束,返回空字串 ""。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(); // 正確讀取整行(含空格)
}
避免混用帶來的認知負擔,採用「全行讀取 + 字串分割/轉型」模式:
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]);
優點:邏輯清晰、無殘留問題、易於擴展驗證(如檢查輸入個數、格式)。
next() 使用「分隔符模式」(預設 \\p{javaWhitespace}+)匹配 token。nextLine() 尋找行分隔符(\\r\\n|\\n|\\r),返回分隔符之前的內容(不含分隔符)。next() 結束時,分隔符(含換行)**未被消耗**,導致後續 nextLine() 直接匹配到空行。掌握 next() 與 nextLine() 的邊界行為,是 Java 控制台程式穩健的關鍵。記住口訣:「next 留換行,nextLine 吃換行;混用必補行,統一用 nextLine 最安心」。