Вопрос по suppressed exceptions в рамках конструкции try-with-resources

84
20 октября 2021, 15:20

Вот цитата из книги Oracle-Certified-Professiona-Java-SE-8-Programmer-Exam-1Z0-809

In a try-with-resources statement, there might be more than one exception that could get thrown; for example, one within the try block, one within the catch block, and another one within the finally block. However, only one exception can be caught, so the other exception(s) will be listed as suppressed exceptions. From a given exception object, you can use the method getSuppressed() to get the list of suppressed exceptions.

Попробовал на практике:

System.out.println("Type an integer in the console: ");
        try(Scanner consoleScanner = new Scanner(System.in)) {
            System.out.println("You typed the integer value: " + consoleScanner.nextInt());
            int kil = 8/0;
        } catch(Exception e) {
// catch all other exceptions here ...
            System.out.println("Error: Encountered an exception and could not read an integer from the console... ");
            System.out.println("Exiting the program - restart and try the program again!");
        }finally {
            int kil = 8/0;
        }

Результат ничуть не удивил:

Type an integer in the console: 
5
You typed the integer value: 5
Error: Encountered an exception and could not read an integer from the console... 
Exiting the program - restart and try the program again!
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at package3.MethodReference.main(MethodReference.java:183)

Никакого suppress не происходит. Или происходит? Тогда как понимать вывод исключения на консоль? Или я что то неправильно понял?

Answer 1

В твоём коде нет нужды в подавлении. Ты ловишь исключение, логируешь, в этот момент оно считается обработанным, потом управление передается в finally и там выбрасывается новое исключение.

Убери секцию catch и лови на уровне выше. В этом случае в секции finally будет выброшено новое исключение, при этом в стэке уже будет одно необработанное - вот в этот момент и произойдет подавление.

public class HelloWorld{
     public static void main(String []args){
        try {
            try (MyResource r = new MyResource()) {
                throw new Exception("from block");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
     }
     public static class MyResource implements AutoCloseable {
         public void close() {
             throw new IllegalStateException("from close");
         }
     }
}
READ ALSO
Преобразование json

Преобразование json

Как разобрать json такого вида:

209
Как выполнить несколько INSERT с результатом SELECT?

Как выполнить несколько INSERT с результатом SELECT?

Как добавить несколько строк в таблицу если одно из значений будет полученно из SELECT? В запросе все значения не меняются кроме, product_id

155
@font-face и имя файла из шрифта

@font-face и имя файла из шрифта

Можно ли каким-то образом сделать так, чтобы при добавлении файла шрифта (woff, ttf), имя файла, font-family, бралось из данных самого шрифта (его свойств/метаданных)?

106
Как запустить выполнение gulp?

Как запустить выполнение gulp?

при выполнении команды gulp watch выдает такое

215