try-with-resources (Java 7) tự gọi close() cho mọi resource khai báo trong ngoặc, theo thứ tự ngược với thứ tự khai báo, kể cả khi có exception.
Điểm khác quan trọng nằm ở tình huống cả khối try lẫn close() cùng ném exception:
java
// try/finally viết tay: exception của close() ghi đè exception gốc
try {
throw new IllegalStateException("real cause");
} finally {
resource.close(); // nếu close() ném, nguyên nhân thật biến mất
}
// try-with-resources: giữ nguyên nhân thật
try (var resource = open()) {
throw new IllegalStateException("real cause");
}
// ném IllegalStateException; exception của close() nằm trong getSuppressed()Suppressed exception là exception bị "nén lại" đó: nó được gắn vào exception chính và lấy ra bằng Throwable.getSuppressed(). Stack trace in ra kèm dòng Suppressed: nên không mất thông tin nào.
Hai chi tiết thường hỏi thêm:
- Resource phải cài AutoCloseable (hoặc Closeable).
- Từ Java 9, biến final hoặc effectively final khai báo sẵn có thể đưa thẳng vào ngoặc: try (existingResource) { ... }.