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

Можем ли мы использовать "return" в блоке finally

Можно ли использовать оператор return в блоке finally. Это может вызвать проблемы?

4b9b3361

Ответ 1

Возврат изнутри блока finally приведет к потере exceptions.

Оператор return внутри блока finally может вызывать любое исключение, которое может быть выброшено в блок try или catch, который должен быть отброшен.

В соответствии с Спецификация языка Java:

Если выполнение блока try завершается внезапно по любой другой причине R, тогда выполняется блок finally, а затем выбор:

   If the finally block completes normally, then the try statement
   completes  abruptly for reason R.

   If the finally block completes abruptly for reason S, then the try
   statement  completes abruptly for reason S (and reason R is
   discarded).

Примечание: согласно JLS 14.17 - оператор возврата всегда завершается внезапно.

Ответ 2

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

EDIT:
Например, в нижеприведенном коде

public class Test {

    public static int test(int i) {
        try {
            if (i == 0)
                throw new Exception();
            return 0;
        } catch (Exception e) {
            return 1;
        } finally {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(test(0));
        System.out.println(test(1));
    }
}

Выход всегда равен 2, так как мы возвращаем 2 из блока finally. Помните, что, наконец, всегда выполняется ли исключение или нет. Поэтому, когда блок finally запускается, он переопределяет возвращаемое значение других. Написание операторов возврата в блоке finally не требуется, на самом деле вы не должны писать его.

Ответ 3

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

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

Написание вашей логики внутри не рекомендуется.

Ответ 4

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

Скажем, у вас есть эта функция

private Integer getnumber(){
Integer i = null;
try{
   i = new Integer(5);
   return i;
}catch(Exception e){return 0;}
finally{
  i = new Integer(7);
  System.out.println(i);
}
}

и вы вызываете это из основного метода

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

Отпечатает

7
5