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

Java 緩存流讀取文件時 while 循環判斷條件的常見錯誤

     編輯:程式設計綜合問答

在使用 BufferedReader.readLine() 讀取文件時,若在 while 循環條件與循環體中重複調用該方法,會導致數據跳行或丟失,甚至拋出異常。這是初學者極易犯的邏輯錯誤。

錯誤代碼示例

// 錯誤寫法 1:條件與體內各調用一次
while (bufr.readLine() != null) {
    i++;
    System.out.println("第" + i + "行:" + bufr.readLine()); // 這裡又讀了一行
}

// 錯誤寫法 2:僅在條件中判斷,體內不讀取
while ((s = bufr.readLine()) != null) {
    i++;
    System.out.println("第" + i + "行:" + bufr.readLine()); // 再次讀取導致跳行
}

正確模式

String s = null;
int i = 0;
while ((s = bufr.readLine()) != null) { // 讀取並賦值給變量
    i++;
    System.out.println("第" + i + "行:" + s); // 直接使用變量
}

原理解析

  • readLine() 每次調用都會移動文件指針到下一行。
  • 條件判斷一次、循環體內再調用一次 = 每次循環讀取兩行,導致奇數行被判斷條件消耗,偶數行被打印,最後一行可能為 null 引發 NPE。

擴展:try-with-resources 自動關閉流(Java 7+)

try (FileReader fr = new FileReader(file);
     BufferedReader bufr = new BufferedReader(fr)) {
    String line;
    int lineNum = 0;
    while ((line = bufr.readLine()) != null) {
        System.out.println("第" + (++lineNum) + "行:" + line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

優點:自動關閉資源,代碼更簡潔安全。

總結

「讀一次,存變量,用變量」 是讀取流數據的鐵律。切勿在判斷條件與循環體中重複調用讀取方法。

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