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(); // 循環結束後關閉流
for (int i = 0; i < a.length; i++) {
dos.writeInt(a[i]);
dos.close(); // ❌ 第一次迭代後關閉流,第二次 writeInt 拋出 IOException: Stream closed
}
for 循環**僅包含緊隨其後的那一條語句**(以分號結尾或塊語句)。{ ... } 內的**所有語句**構成循環體。錯誤版本中,dos.close() 被包含在 { } 內,成為循環體一部分。第一次循環寫入後關閉流,第二次迭代嘗試寫入已關閉的流,拋出 IOException。
{ statement; },防止後期維護時誤添加語句導致邏輯錯誤。finally 塊中進行。try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("D:/zpc.txt"))) {
for (int i = 0; i < a.length; i++) {
dos.writeInt(a[i]);
}
} // 自動調用 dos.close()
這個看似微小的大括號差異,實則關係到資源生命週期管理的正確性。嚴格遵循「資源獲取即初始化、循環體專注業務邏輯、統一在外層釋放」原則,可避免此類低級錯誤。