Tôi đã tìm thấy hai trường hợp:
- Mất kết nối mạng khi vẫn còn dữ liệu trong bộ đệm để được rửa.
- Có hệ thống tệp lấp đầy (hoặc đạt đến giới hạn người dùng của bạn cho kích thước tệp) khi vẫn còn dữ liệu trong bộ đệm bị xóa.
Cả hai ví dụ này đều phụ thuộc vào điều gì đó xảy ra khi vẫn còn dữ liệu trong bộ đệm. Đóng xóa bộ đệm trước khi tệp đóng, vì vậy nếu có lỗi ghi dữ liệu vào tệp, nó sẽ phát ra một IOException.
Nếu bạn thực thi mã sau, hãy truyền tên của tệp để tạo trên ổ đĩa mạng, sau đó nhấn phím enter để rút cáp mạng, nó sẽ làm cho chương trình đưa ra một IOException.
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Test
{
public static void main(final String[] argv)
{
final File file;
file = new File(argv[0]);
process(file);
}
private static void process(final File file)
{
Writer writer;
writer = null;
try
{
writer = new FileWriter(file);
writer.write('a');
}
catch(final IOException ex)
{
System.err.println("error opening file: " + file.getAbsolutePath());
}
finally
{
if(writer != null)
{
try
{
try
{
System.out.println("Please press enter");
System.in.read();
}
catch(IOException ex)
{
System.err.println("error reading from the keyboard");
}
writer.close();
}
catch(final IOException ex)
{
System.err.println("See it can be thrown!");
}
}
}
}
}
Kể từ Java 7 bạn có thể sử dụng thử-với-nguồn lực để thoát ra khỏi mớ hỗn độn này (không xoá mã thế hệ ngoại lệ rõ ràng cho sự vận hành close()
):
private static void process(final File file) {
try (final Writer writer = new FileWriter(file)) {
writer.write('a');
} catch (final IOException e) {
// handle exception
}
}
này sẽ tự kỳ diệu xử lý các ngoại lệ trong close()
và nó thực hiện kiểm tra rõ ràng null
nội bộ.
yup, bất cứ điều gì có thể "biến mất" đều có thể khiến điều đó xảy ra. Một vụ tai nạn ổ đĩa cứng có thể có thể làm điều đó quá. – TofuBeer