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()
выдает Exception, а затемдаже close()
функция [в блоке finally] выдает исключение, тогда последнему присваивается больший приоритет, и он возвращается к вызывающей функции.В этом случае Exception thrown by the readLine() method is ignored/suppressed
.Вы можете зацепить вызывающее исключение в своем исключении и перебросить свое исключение из блока finally.
Поскольку была предоставлена функциональность 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
выбрасывается при закрытии ресурса [Представьте, что это происходит в неявном блоке finally, который создает оператор try-with-resource], затем Exception1 подавляет Exception2.
Несколько замечаний, которые следует здесь отметить -
- Если блок try-with-resource выдает исключение, т. Е. При создании экземпляра ресурса, блок try не будет выполнен, и будет выдано то же исключение.
- Если экземпляр ресурса успешен, блок try выдает исключение и исключениегенерируется при закрытии ресурса, затем исключение, генерируемое при закрытии ресурса, подавляется исключением, генерируемым из блока try.
- Если вы укажете явный блок finally и из этого блока будет сгенерировано исключение, оно будет подавлять все остальные исключения.(Этот явный блок finally выполняется после закрытия ресурсов)
Я скомпилировал большинство возможных сценариев с фрагментами кода и вывел их в следующем посте.
Подавленные исключения в Java 7
Надеюсь, что поможет.