Try-catch-finally в Java - PullRequest
       48

Try-catch-finally в Java

26 голосов
/ 22 августа 2011

В Java не будет выполнен блок finally, если мы вставим инструкцию return в блок try try-catch-finally?

Ответы [ 8 ]

25 голосов
/ 22 августа 2011

Единственный раз, когда блок finally не будет выполнен, это когда вы вызываете exit() до достижения finally. Вызов exit() отключит JVM, поэтому дальнейшая строка кода не будет запущена.

РЕДАКТИРОВАТЬ: Это не совсем правильно. См. Комментарии ниже для получения дополнительной информации.

9 голосов
/ 22 августа 2011

Блок finally всегда будет выполняться независимо от того, вернетесь ли вы или возникнет исключительная ситуация в блоке try.

См. Также раздел 14.19.2 Выполнение try-catch-finally Спецификации языка Java

3 голосов
/ 22 августа 2011

Блок finally выполняется во всех этих случаях. Точка выполнения блока finally в конце состоит в том, чтобы позволить вам освободить все полученные ресурсы.

Ниже приведен пример, показывающий, как это работает.

public class Hello {

    public static void hello(){
        try{
            System.out.println("hi");
            return;
            }catch(RuntimeException e){
        }finally{
            System.out.println("finally");

        }

    }

    public static void main(String[] args){
        hello();
    }
}
2 голосов
/ 11 апреля 2014

Выполняется, даже если вы вернетесь внутрь блока try. Я поместил один оператор return внутри try и один внутри finally, и возвращаемое значение было от finally, а не от try.

public class HelloWorld{
   public static void main(String args[]){
      System.out.println(printSomething());
   }

   public static String printSomething(){
      try{
          return "tried";
      } finally{
          return "finally";
      }
   }
}

Вывод, который я получил, был "наконец-то".

0 голосов
/ 25 августа 2015

Если ваш блок finally имеет возврат, он переопределит любой возврат в блоке try-catch. Из-за этой "особенности" рекомендуется, чтобы блок finally никогда не вызывал исключение или не имел оператора возврата.

0 голосов
/ 09 июля 2014

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

0 голосов
/ 09 июля 2014

Если вы позвоните System.exit(), как сказал кто-то другой, он не будет выполнен, но я считаю, что он также не будет выполнен , если в блоке исключений есть исключение .

0 голосов
/ 19 мая 2014

Согласно официальному объяснению :

Примечание. Если JVM завершает работу во время выполнения кода try или catch, блок finally может не выполняться. Аналогично, если поток, выполняющий код try или catch, прерывается или уничтожается, блок finally может не выполняться, даже если приложение в целом продолжается.

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

...