問題現象
Scanner in = new Scanner(System.in);
System.out.print("請輸入i的值: ");
int i = in.nextInt(); // 輸入 "3" 並按 Enter
System.out.print("請輸入姓名: ");
String name = in.nextLine(); // 直接讀到空字符串,跳過輸入
System.out.print("請輸入性別: ");
String sex = in.nextLine(); // 實際讀到姓名輸入
根本原因
nextInt() 只讀取整數部分,**不消耗後面的換行符** \n。
- 緩衝區殘留
\n,緊接的 nextLine() 讀取該換行符並返回空字符串。
解決方案
方法一:額外調用 nextLine() 清空緩衝區 (推薦)
int i = in.nextInt();
in.nextLine(); // 消耗殘留的換行符
String name = in.nextLine(); // 正常等待輸入
方法二:統一使用 nextLine() 再解析
String line = in.nextLine();
int i = Integer.parseInt(line.trim());
String name = in.nextLine();
方法三:使用正則跳過空白 (不推薦)
in.skip("(\r\n|\n)"); // 手動跳過換行符
完整修正示例
Scanner in = new Scanner(System.in);
System.out.print("請輸入i的值: ");
int i = in.nextInt();
in.nextLine(); // 關鍵:清空緩衝區換行符
for (int j = 1; j <= i; j++) {
System.out.print("請輸入姓名: ");
String name = in.nextLine();
System.out.print("請輸入性別: ");
String sex = in.nextLine();
System.out.print("請輸入年齡: ");
int age = in.nextInt();
System.out.print("請輸入成績: ");
float score = in.nextFloat();
in.nextLine(); // 每次 nextInt/nextFloat 後補一個 nextLine()
// 處理學生對象...
}
最佳實踐原則
- 混合使用 nextXxx() 和 nextLine() 時,每次 nextInt/nextDouble/nextFloat 後緊跟一個 nextLine()。
- 或統一用
nextLine() 讀取整行,再用 Integer.parseInt、Float.parseFloat 解析,邏輯更清晰。
- 關閉 Scanner 時調用
in.close() (但注意會關閉 System.in,後續無法再讀取)。