Всегда ли выполняется блок finally в Java? - PullRequest
2172 голосов
/ 15 сентября 2008

Учитывая этот код, могу ли я быть абсолютно уверенным , что блок finally всегда выполняется, независимо от того, чем является something()?

try {  
    something();  
    return success;  
}  
catch (Exception e) {   
    return failure;  
}  
finally {  
    System.out.println("I don't know if this will get printed out");
}

Ответы [ 46 ]

4 голосов
/ 13 мая 2015

Я был очень смущен всеми ответами, предоставленными на разных форумах, и решил, наконец, написать код и посмотреть. Выход:

, наконец, будет выполнен, даже если есть возврат в блоке try и catch.

try {  
  System.out.println("try"); 
  return;
  //int  i =5/0;
  //System.exit(0 ) ;
} catch (Exception e) {   
  System.out.println("catch");
  return;
  //int  i =5/0;
  //System.exit(0 ) ;
} finally {  
   System.out.println("Print me FINALLY");
}

выход

попробовать

Напечатай меня НАКОНЕЦ

  1. Если return заменяется на System.exit(0) в блоке try и catch в приведенном выше коде, и перед ним возникает исключение по любой причине.
4 голосов
/ 13 октября 2011

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

Только когда он не запускается, происходит выход из JVM.

4 голосов
/ 13 мая 2010

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

3 голосов
/ 29 апреля 2016

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

try{
}finally{
   try{
   }finally{
      //if(someCondition) --> no error because of unreachable code
      throw new RunTimeException();
   }
   int a = 5;//unreachable code
}
2 голосов
/ 10 мая 2018

Наконец всегда вызывается в конце

когда вы пытаетесь, он выполняет некоторый код, если что-то происходит при попытке, то catch поймает это исключение, и вы можете распечатать некоторое сообщение mssg или выдать ошибку, и, наконец, будет выполнен блок.

Наконец, обычно используется при выполнении очистки, например, если вы используете сканер в Java, вам, вероятно, следует закрыть сканер, так как это приводит к другим проблемам, таким как невозможность открыть какой-либо файл

2 голосов
/ 21 апреля 2018

Блок finally выполняется всегда, даже если вы поместили оператор return в блок try. Блок finally будет выполнен перед оператором return.

...