while ((s = br.readLine()) != null && s.length() != 0); // ❌ 這裡有分號!
{
System.out.print("你輸入的內容為:" + s);
System.out.print("請輸入一行內容(直接回車退出程序):");
}
分號的致命後果:
while (...); 是一條**空語句循環**,循環體為空。s.length()==0)或流結束,**不做任何輸出**。{ ... } 只是一個**獨立的代碼塊**,**僅執行一次**,使用的是循環結束時的 s(空字符串 "" 或 null)。BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
System.out.print("請輸入一行內容(直接回車退出程序):"); // 首次提示
while ((s = br.readLine()) != null && s.length() != 0) { // 無分號!
System.out.println("你輸入的內容為:" + s);
System.out.print("請輸入一行內容(直接回車退出程序):"); // 循環末尾提示下一次
}
System.out.println("程序結束");
請輸入一行內容(直接回車退出程序):hello
你輸入的內容為:hello
請輸入一行內容(直接回車退出程序):world
你輸入的內容為:world
請輸入一行內容(直接回車退出程序): ← 直接回車,s="",長度 0,循環結束
程序結束
代碼執行順序**嚴格自上而下**:
InputStreamReader is = new InputStreamReader(System.in); — 創建流對象,**不阻塞,不等待輸入**。BufferedReader br = new BufferedReader(is); — 包裝緩衝,**不阻塞**。System.out.print("請輸入..."); — **輸出提示到控制台**。s = br.readLine() — **這裡才阻塞等待用戶輸入**。所以提示**先於**阻塞讀取出現,完全符合順序邏輯。try 塊只是異常捕獲範圍,不改變執行順序。
Scanner sc = new Scanner(System.in);
System.out.print("請輸入一行內容(直接回車退出程序):");
while (sc.hasNextLine()) {
String s = sc.nextLine();
if (s.isEmpty()) break;
System.out.println("你輸入的內容為:" + s);
System.out.print("請輸入一行內容(直接回車退出程序):");
}
sc.close();
readLine() **之前**,讀取在 **循環條件判斷中** 完成。readLine() 返回 null (EOF/Ctrl+D/Ctrl+Z) 或 s.length()==0 (空行/直接回車)。