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

Java Scanner 多行輸入如何優雅結束?避免 "end" 字符串比較陷阱

     編輯:程式設計綜合問答

錯誤代碼分析

Scanner in = new Scanner(System.in);
String[] input = new String[26];
for (int i = 0; input[i] != "end"; i++) {  // ❌ 錯誤:字符串用 != 比較引用
    input[i] = in.next();
}
in.close();

三大致命問題:

  1. input[i] != "end":字符串**必須用 .equals() 比較內容**,!= 比較對象引用,字面量 "end" 與 in.next() 返回的新對象引用永不相等 → 死循環。
  2. for 循環先判斷條件再執行體:i=0 時 input[0] 為 null,null != "end" 為 true 進入循環,但隨後 in.next() 讀取第一個詞,而非預期的「先讀再判」。
  3. in.next() 按**空白符分詞**,而非按行讀取。輸入 "this is line" 會被拆成 3 次循環。

正確模式:do-while + nextLine() + equals()

Scanner in = new Scanner(System.in);
List<String> lines = new ArrayList<>();  // 動態列表優於固定數組

String line;
do {
    line = in.nextLine();  // 按行讀取,保留空格
    if (!"end".equals(line)) {  // 防空指針,常量在前
        lines.add(line);
    }
} while (!"end".equals(line));

in.close();
// lines 現在包含除 "end" 外的所有行
System.out.println("共讀取 " + lines.size() + " 行");

關鍵點對比

方法分隔符返回值適用場景
next()空白符 (空格/換行/Tab)單詞解析命令參數、數字序列
nextLine()換行符 \n/\r\n整行 (含空格)讀取文本行、用戶輸入句子
nextInt() 等空白符基本類型直接讀數字,需配合 nextLine() 清理換行符

進階:帶超時/非阻塞的控制台輸入

標準 Scanner 無超時機制。若需「5 秒無輸入自動繼續」:

ExecutorService es = Executors.newSingleThreadExecutor();
Future<String> future = es.submit(() -> {
    Scanner s = new Scanner(System.in);
    return s.nextLine();
});
try {
    String line = future.get(5, TimeUnit.SECONDS);
    // 處理輸入
} catch (TimeoutException e) {
    future.cancel(true);
    System.out.println("輸入超時");
} finally {
    es.shutdownNow();
}

總結

  1. 字符串比較**永遠用 .equals()**,常量寫前防 NPE:"end".equals(input)。
  2. 按行讀取用 nextLine(),按詞用 next()。
  3. 未知行數用 List + do-while,避免數組越界與邏輯倒置。
  4. 控制台輸入本質是阻塞 I/O,複雜交互場景建議用成熟 CLI 庫(Picocli, JLine 3)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved