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

Java do-while 迴圈因變數捕獲換行符導致無法結束

     編輯:程式設計綜合問答

錯誤程式碼

char ch;
do {
    System.out.println("Enter a char:");
    ch = (char) System.in.read(); // 讀 'k'
    if (ch == 'k') System.out.println("you're right");
    else { System.out.println("you're wrong"); System.out.println("try again"); }
    
    do { ch = (char) System.in.read(); } while (ch != '\n'); // 吃掉換行
} while (ch != 'k'); // ★ 此處 ch 為 '\n',永遠 != 'k',無限迴圈

根因

內層 `do-while` 專門讀取並丟棄換行符 (`\n`),迴圈結束時 `ch` **保留最後讀到的字元,即 `\n`**。外層判斷 `ch != 'k'` 使用的是這個被覆寫的 `ch`,永遠為真。

修正方案

方案 A:使用獨立變數吃掉換行

char ch;
do {
    System.out.print("Enter a char: ");
    ch = (char) System.in.read();
    if (ch == 'k') System.out.println("you're right");
    else { System.out.println("you're wrong\ntry again"); }
    
    int c; // 獨立變數
    while ((c = System.in.read()) != '\n' && c != -1) { /* discard */ }
} while (ch != 'k');

方案 B:改用 Scanner (推薦,自動處理換行與空白)

Scanner sc = new Scanner(System.in);
String input;
do {
    System.out.print("Enter a char: ");
    input = sc.next(); // 讀取下一個 token (跳過空白/換行)
    if ("k".equals(input)) System.out.println("you're right");
    else System.out.println("you're wrong\ntry again");
} while (!"k".equals(input));
sc.close();

方案 C:BufferedReader 整行讀取

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
do {
    System.out.print("Enter a char: ");
    line = br.readLine(); // 含換行已移除
    if ("k".equals(line)) System.out.println("you're right");
    else System.out.println("you're wrong\ntry again");
} while (!"k".equals(line));

核心教訓:迴圈條件變數勿在迴圈體內被覆寫為無關值;互動式輸入優先使用 `Scanner` 或 `BufferedReader`,避免手動處理 `System.in.read()` 的換行符陷阱。

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