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`,永遠為真。
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');
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();
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()` 的換行符陷阱。