Блок finally работает всегда в Java?

У меня есть try/catch с return внутри. Блок будет работать finally?

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("No se si esto se va a imprimir.");
}

Я, что я могу писать это и видеть, что он происходит (Что является действительно тем, что я сделаю), но когда busquè в google, ничто не появилось, тогда задал вопрос здесь.

Это переведенный вопрос оригинала в ingés и приспособленная в результатах, которые он дает в моем компьютере: Does finally always execute in Java? jonny five

26
задан 23.05.2017, 05:39
3 ответа

finally он будет так называемым.

Единственные разы, которые finally не выполнят, будут когда:

  1. если ты называешь System.exit () ó
  2. если у jvm есть первая неудача (крах)

Этот ответ - перевод оригинала на английском jodonnell

Изданный 12/2/15: Принимая во внимание Does the finally block execute if the thread running the function is interrupted? Субрахиоти Махумдер

26
ответ дан 01.12.2019, 08:18
  • 1
    мне не очень ясно это копирования вопросов и отвечать их тебе, но так как ты кладешься podr и # 237; схвати копировать ответ " mejorada". В комментарии aclar и # 243; что interrupt() не избегает того, чтобы работал finally, s и # 243; это м и # 233; все в неупотребительности stop() или suspend(), не называя resume(). Скопированный комментарий из Кристиан Семрау – Robertiano 02.12.2015, 10:18
  • 2
    Есть много м и # 225; s случаи, в которых не работает блок finally. jvm рожден преждевременно внешними агентами (kill). Гаснет компьютер. Бесконечный цикл внутри try. – Jose Antonio Reinstate Monica 12.12.2015, 16:17

Очень простой вопрос, основанный на началах java, блок finally всегда будет так называемым.

try {
    //Declaraciones que pueden causar una excepción.
}
catch {
   //Manejo de excepción.
}
finally {
   //Declaraciones a ser ejecutadas
}

Всякий раз когда как он комментируется, закончи выполнение кода или существовали ошибки.

Больше информации: The Финальи Блокк

7
ответ дан 01.12.2019, 08:18

НЕ ВСЕГДА

Спецификация языка Java описывает, как функционируют блоки try-catch-finally и try-finally в разделе 14.20.2.
Ни в каком месте определи, что finally он работал всегда.
Но да определи, что для всех случаев, в которых блок try-catch-finally или try-finally он завершается раньше, нужно выполнять блок finally.

А именно. Если SIG - то, что будет работать после блока try-catch-finally или try-finally, и КОНЕЦ - то, что есть внутри finally, JLS гарантирует, что КОНЕЦ работает всегда до того, как работал SIG.

Почему JLS не гарантирует, что блок finally работает всегда вслед за блоком try? Потому что невозможно. Неправдоподобно но возможно, что виртуальная машина рождена преждевременно (kill, крах, отключать регулирующий) я участвую в рыцарском турнире, закончив блок try и до того, как работал блок finally. И нет ничего, что могло бы делаться со спецификации языка, чтобы это предотвращать.

4
ответ дан 01.12.2019, 08:18