Поведение return в catch и finally


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

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);
    }

}

в результате получается обратный Вал: 10.

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

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

6 60

6 ответов:

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

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

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

  1. исключение
  2. исключение поймано и возвращаемое значение установлено в 5
  3. наконец блок выполняется и возвращаемое значение устанавливается в 10
  4. функция возвращает

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

  1. возвращаемое значение помещается в стек с помощью кода catch.
  2. после этого код finally выполняется и перезаписывает значение в стеке.
  3. затем метод возвращает наиболее актуальное значение (10), которое будет использоваться вызывающим объектом.

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

(забавная заметка на полях)

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

enter image description here

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

так вот в приведенном выше примере Exection бросается оператором try и получает catch в блоке catch. Есть оператор return со значением 5 так что в стеке значение вызова 5 добавляется позже, наконец, блок выполняется и последнее возвращаемое значение добавляется поверх стека при возврате значения, стек возвращает последнее значение согласно поведению стека "ПОСЛЕДНИЙ В ПЕРВОМ ВЫХОДЕ" так он будет возвращать значение как 10.

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

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

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