Java предложение finally в вложенном блоке try - PullRequest
2 голосов
/ 08 января 2020

Будет ли выполнено следующее предложение finally , если исключение выдается PrintWriter ?

try{
   PrintWriter out = new PrintWriter(filename);
   try {
       //output
   } finally {
       out.close();
   }
} catch {
   //handle exception
}

Если PrintWriter выдает исключение, тогда вложенный блок try никогда не будет выполнен, но почему вложенное предложение finally все еще будет выполняться, даже если он вложен и пропущен?

Обновления: Я провел несколько тестов, если перед вложенным предложением try , которое вложено *, было сгенерировано исключение. 1020 * наконец не будет выполнен. Если исключение выдается внутри вложенного предложения try , то будет выполнено внутреннее finally и внешний catch .

Ответы [ 3 ]

4 голосов
/ 08 января 2020

Нет, потому что внутренний блок try не будет достигнут, когда возникнет исключение, и, следовательно, также не будет достигнут блок finally.

1 голос
/ 08 января 2020

Наконец, блок всегда выполняется независимо от того, обрабатывается исключение или нет. Несмотря на то, что они являются ошибкой и достигают перехвата блока, он будет go, чтобы окончательно заблокировать выполнение фрагмента кода.

Блок finally - это блок, который используется для выполнения важного кода, такого как закрытие соединения, поток и т. Д. c.

Итак, внутри блока try {}, который вы поместили попробуйте и наконец, но вы спросили о перехвате внешней попытки, таким образом, она не идет в блок первой попытки. Это, наконец, не сработает.

PS: Если вы наконец-то поставите что-то вроде этого:

     try{
          try{...}
          finally{...}
        }catch(Exception e){...}
        finally{... }
//in case of exception also , the outside finally is going to work.

PS: Хоть ты и получил ответ, но эта концепция предназначена для других наивных программистов

0 голосов
/ 08 января 2020

Более уродливый вариант (иногда генерируемый IDE) также можно увидеть:

// *** UGLY
PrintWriter out = null;
try {
    out = new PrintWriter(filename);
    //output
} catch (IOException e) {
    //handle exception
} finally {
    if (out != null) {
        try {
            out.close();
        } catch (IOException e2) {
            // IGNORE
        }
    }
}

Это немного объясняет код: так как close может также вызвать IOException, код становится громоздким. Ваш код по-прежнему нуждается во вложенных исключениях.

При использовании try-with-resources это можно и нужно записать как:

try (PrintWriter out = new PrintWriter(filename)) {
    //output
} catch (IOException e) {
    //handle exception
} // Automatically closes.

И больше нет вложенных исключений.

Самое большое преимущество заключается в том, что вам не нужно перехватывать какие-либо исключения, а просто добавить throws IOException в сигнатуру метода.

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