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

Java 控制台輸入循環:while 後分號導致邏輯斷裂,Scanner/BufferedReader 正確姿勢

     編輯:程式設計綜合問答

錯誤代碼分析

while ((s = br.readLine()) != null && s.length() != 0);  // ❌ 這裡有分號!
{
    System.out.print("你輸入的內容為:" + s);
    System.out.print("請輸入一行內容(直接回車退出程序):");
}

分號的致命後果:

  1. while (...); 是一條**空語句循環**,循環體為空。
  2. 循環反覆讀取輸入,直到輸入空行(s.length()==0)或流結束,**不做任何輸出**。
  3. 循環結束後,緊隨其後的 { ... } 只是一個**獨立的代碼塊**,**僅執行一次**,使用的是循環結束時的 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,循環結束
程序結束

關於「為什麼提示在 try 塊第一行前出現」的疑問

代碼執行順序**嚴格自上而下**:

  1. InputStreamReader is = new InputStreamReader(System.in); — 創建流對象,**不阻塞,不等待輸入**。
  2. BufferedReader br = new BufferedReader(is); — 包裝緩衝,**不阻塞**。
  3. System.out.print("請輸入..."); — **輸出提示到控制台**。
  4. s = br.readLine() — **這裡才阻塞等待用戶輸入**。

所以提示**先於**阻塞讀取出現,完全符合順序邏輯。try 塊只是異常捕獲範圍,不改變執行順序。

Scanner 版本(更簡潔)

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();

總結

  1. while 後絕不可加分號,除非你真的想寫空循環(極少見)。
  2. 提示輸出在 readLine() **之前**,讀取在 **循環條件判斷中** 完成。
  3. 退出條件:readLine() 返回 null (EOF/Ctrl+D/Ctrl+Z) 或 s.length()==0 (空行/直接回車)。
  4. 初學者易混淆「語句結束符 ;」與「代碼塊 { }」的關係,**養成「while 條件後緊跟 {」的肌肉記憶**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved