Поведение оператора return в catch и, наконец,

См. следующий код и объясните поведение вывода.

public class MyFinalTest {

    public int doMethod(){
        try{
            throw new Exception();
        }
        catch(Exception ex){
            return 5;
        }
        finally{
            return 10;
        }
    }

    public static void main(String[] args) {

        MyFinalTest testEx = new MyFinalTest();
        int rVal = testEx.doMethod();
        System.out.println("The return Val : "+rVal);
    }

}

В результате возвращается Val: 10.

Eclipse показывает предупреждение: finally block does not complete normally.

Что происходит с оператором return в блоке catch?

Ответ 1

Он переопределяется в finally, потому что finally выполняется после всего остального.

Итак, эмпирическое правило - никогда не возвращаться из finally. Например, Eclipse показывает предупреждения для этого фрагмента: "блок finally не завершается нормально"

Ответ 2

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

  • Исключено исключение
  • Исключение поймано, а возвращаемое значение равно 5
  • Наконец, блок выполняется, а возвращаемое значение равно 10
  • Функция возвращает

Ответ 3

Это простой вопрос, если вы помните макет низкого уровня виртуальной машины.

  • Возвращаемое значение помещает стек по коду catch.
  • Затем код finally выполняется и перезаписывает значение в стеке.
  • Затем метод возвращается с самым последним значением (10), которое будет использоваться вызывающим.

Если вы не уверены в таких вещах, вернитесь к пониманию базовой системы (в конечном счете, на уровне ассемблера).

(смешное sidenote)

Ответ 4

Блок finally всегда выполняется (если был выполнен соответствующий запрос), прежде чем метод вернет 5, как в блоке catch, он выполнит блок finally и вернет 10.

Ответ 5

введите описание изображения здесь

Наконец, блок всегда выполняется, пока и до тех пор, пока оператор System.exit() не станет первым в блоке finally.

Итак, здесь, в приведенном выше примере Exception вызывается оператором try и получает catch в catch catch. Существует оператор return со значением 5, поэтому в значение вызова стека 5 добавляется позже, наконец, выполняется блок и добавляется последнее возвращаемое значение поверх стека при возврате значения, стека вернуть последнее значение в соответствии с поведением стека "LAST IN FIRST OUT" , чтобы оно возвращало значение как 10.

Ответ 6

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

Session session //  opened some session 
try 
{
 // some error 
}
catch { log.error }
finally 
{ session.logout();}

он не должен ничего использовать. вы можете использовать за пределами.