Trong khi làm việc trên một dự án trường học, tôi đã viết đoạn mã sau:Java try/catch/finally thực hành tốt nhất trong khi mua/nguồn lực đóng
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(shapes);
} catch (FileNotFoundException ex) {
// complain to user
} catch (IOException ex) {
// notify user
} finally {
if (oos != null) oos.close();
if (fos != null) fos.close();
}
Vấn đề là Netbeans là nói cho tôi những resource.close()
dòng ném một IOException
và do đó phải bị bắt hoặc tuyên bố. Nó cũng phàn nàn rằng oos
và fos
có thể chưa được khởi tạo (mặc dù các kiểm tra null).
Điều này có vẻ hơi lạ, xem như thế nào là toàn bộ điểm là dừng ngay IOException
ngay tại đó.
My sửa chữa đầu gối giật là để làm điều này:
} finally {
try {
if (oos != null) oos.close();
if (fos != null) fos.close();
} catch (IOException ex) { }
}
Nhưng sâu thẳm này làm tôi bực mình và cảm thấy bẩn.
Tôi đến từ nền C#, nơi tôi chỉ đơn giản là tận dụng lợi thế của khối using
, vì vậy tôi không chắc chắn về cách "đúng" là xử lý việc này.
Điều gì là đúng cách để xử lý vấn đề này?
Lưu ý rằng sửa chữa đầu gối giật bạn sẽ không đóng 'fos' khi 'oos.close() 'ném' IOException'. Mỗi cần phải đi thử riêng của mình. 'if (oos! = null) thử {oos.close()} catch (IOException logOrIgnore) {}' và cứ thế. – BalusC
@ BalusC - đó là một điểm tốt. Cảm ơn ... bắt ... rằng: D –
Thực ra, oos.close() cũng đóng các fos cơ bản. – SimonJ