Зачем нужен блок наконец в Java? - PullRequest
0 голосов
/ 23 мая 2018

Рассмотрим код из документации Java ниже:

public void writeList() {
    PrintWriter out = null;

    try {
        System.out.println("Entering" + " try statement");

        out = new PrintWriter(new FileWriter("OutFile.txt"));
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } catch (IndexOutOfBoundsException e) {
        System.err.println("Caught IndexOutOfBoundsException: "
                           +  e.getMessage());

    } catch (IOException e) {
        System.err.println("Caught IOException: " +  e.getMessage());

    } finally {
        if (out != null) {
            System.out.println("Closing PrintWriter");
            out.close();
        } 
        else {
            System.out.println("PrintWriter not open");
        }
    }
}

"finally block executes whether an exception happens or not or an exception is not handled" это определение, которое я вижу повсюду.

Мой вопрос: что, если я заменю два блока catch на один catchпоговорка

try {
        System.out.println("Entering" + " try statement");

        out = new PrintWriter(new FileWriter("OutFile.txt"));
        for (int i = 0; i < SIZE; i++) {
            out.println("Value at: " + i + " = " + list.get(i));
        }
    } catch (Exception e) {
        e.printStacktrace()
    }

Выше кода обрабатывает все исключения.Итак, зачем нам нужен наконец блок?Вместо того, чтобы что-то делать в блоке finally, я могу написать, что за пределами блока try-catch оба значения одинаковы.

Зачем нам нужен блок finally здесь?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

вам не нужен блок finally.Тем не менее, это решение считается плохой практикой.

Причина в том, что теперь ключевая фраза должна оставаться точно , чтобы обеспечить правильное закрытие ресурса.А теперь представьте, если другому программисту (или даже вам самим) нужно изменить этот кусок кода где-то в не столь отдаленном будущем. Кстати,

, так как Java 7, самый безопасный способ обеспечить ресурсы должным образомзакрыто, значит использовать try-with-resources .

0 голосов
/ 23 мая 2018

Согласно оракулу Документация:

Блок finally всегда выполняется при выходе из блока try.Это гарантирует, что блок finally выполняется даже в случае непредвиденного исключения.Но, наконец, полезно не только для обработки исключений, но и позволяет программисту избежать случайного обхода кода очистки при возврате, продолжении или разрыве.Помещение кода очистки в блок finally - это всегда хорошая практика, даже если исключений не ожидается.

Подробнее читайте эту статью .

Теперь ответьте наВаш следующий вопрос:

Теперь вышеприведенный код обрабатывает все исключения.Итак, зачем мне наконец-то блокировать здесь?Вместо того, чтобы что-то писать в блоке finally, я могу написать, что за пределами блока try-catch оба значения одинаковы.

Предположим, вы повторно генерируете исключение из блока catch в таком состоянии.не из кодов после этого блока catch будет выполняться, но если вы добавите блок finally, все коды внутри блока finally будут выполняться до повторного выброса исключения из блока catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...