Подтвердить что ты не робот

Try-catch - наконец-то в java

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

4b9b3361

Ответ 1

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

EDIT: Это не совсем правильно. См. Комментарии ниже для получения дополнительной информации.

Ответ 2

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

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

Ответ 3

Блок 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();
    }
}

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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