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

Java for 循環大括號語義差異:缺少大括號導致 close() 提前調用引發寫入異常

     編輯:程式設計綜合問答

代碼對比

正確版本(無大括號,循環體僅一條語句)

DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:/zpc.txt"));
int a[] = {1,3,4,62,13,35};
for (int i = 0; i < a.length; i++)
    dos.writeInt(a[i]);  // 循環體只有這句
dos.close();             // 循環結束後關閉流

錯誤版本(加大括號,誤將 close() 放入循環體)

for (int i = 0; i < a.length; i++) {
    dos.writeInt(a[i]);
    dos.close();  // ❌ 第一次迭代後關閉流,第二次 writeInt 拋出 IOException: Stream closed
}

語法規則解析

  • 無大括號:for 循環**僅包含緊隨其後的那一條語句**(以分號結尾或塊語句)。
  • 有大括號:{ ... } 內的**所有語句**構成循環體。

錯誤版本中,dos.close() 被包含在 { } 內,成為循環體一部分。第一次循環寫入後關閉流,第二次迭代嘗試寫入已關閉的流,拋出 IOException。

最佳實踐建議

  1. 養成始終加大括號習慣:即使循環體只有一句,也寫 { statement; },防止後期維護時誤添加語句導致邏輯錯誤。
  2. 資源關閉放在循環外:流、連接、鎖等資源的釋放應在循環完全結束後、或 finally 塊中進行。
  3. 使用 try-with-resources (Java 7+) 自動管理資源:
    try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:/zpc.txt"))) {
        for (int i = 0; i < a.length; i++) {
            dos.writeInt(a[i]);
        }
    } // 自動調用 dos.close()
    

這個看似微小的大括號差異,實則關係到資源生命週期管理的正確性。嚴格遵循「資源獲取即初始化、循環體專注業務邏輯、統一在外層釋放」原則,可避免此類低級錯誤。

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