ARM - Автоматичне управління ресурсами (представлено з Java 7)
Візьмемо дуже простий приклад
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Тепер, якщо readLine()
функція викидає виняток, а потім навіть close()
функція [у блоці нарешті] викидає виняток, тоді пізніший надається більше пріоритету і повертається до викличної функції. У цьому випадкуException thrown by the readLine() method is ignored/suppressed
. Ви можете ланцюжком викликати виняток у вашому винятку і повернути свій виняток з нарешті блокувати.
Оскільки java 7
була надана функціональність для отримання пригнічених винятків. Ви можете викликати public final java.lang.Throwable[] getSuppressed()
функцію на спійманому об'єкті, який можна кинути, щоб переглянути пригнічені винятки.
Для напр.
static String readFirstLineFromFileWithFinallyBlock(String path)
throws Exception {
try (BufferedReader br = new BufferedReader(new FileReader(path));) {
return br.readLine();
}
}
Тепер, якщо br.readLine();
рядок кидає, Exception1
а потім дозволяє сказати Exception2
, що кидається під час закриття ресурсу [уявіть, що це відбувається в неявному остаточному блоці, який створює оператор try-with-resource], тоді Exception1 придушує Exception2.
Тут слід відзначити кілька пунктів -
- Якщо блок try-with-resource видає виняток, тобто під час створення екземпляра ресурсу, тоді блок try не буде виконуватися, і буде викинутий той самий виняток.
- Якщо створення екземпляра ресурсу успішне, спроба блоку викидає виняток, а виняток створюється під час закриття ресурсу, тоді виняток, викинутий під час закриття ресурсу, придушується винятком, викинутим із блоку try.
- Якщо ви надаєте явний блок нарешті, а виняток викидається з цього блоку, він буде придушувати всі інші виключення. (Цей явний блок нарешті виконується після закриття ресурсів)
Я скомпілював більшість можливих сценаріїв із фрагментами коду та результатами в наступному дописі.
Пригнічені винятки в Java 7
Сподіваюся, що це допомагає.