Поведение 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 ответов:
Он переопределяется в
finally, потому чтоfinallyвыполняется после всего остального.вот почему, правило - никогда не вернуться из
finally. Eclipse, например, показывает предупреждение для этого фрагмента: "наконец блок не завершается нормально"
finallyвсегда выполняется (единственное исключение -System.exit()). Вы можете думать об этом поведении следующим образом:
- исключение
- исключение поймано и возвращаемое значение установлено в 5
- наконец блок выполняется и возвращаемое значение устанавливается в 10
- функция возвращает
Это простой вопрос, если вы помните макет низкого уровня виртуальной машины.
- возвращаемое значение помещается в стек с помощью кода catch.
- после этого код finally выполняется и перезаписывает значение в стеке.
- затем метод возвращает наиболее актуальное значение (10), которое будет использоваться вызывающим объектом.
Если вы не уверены в таких вещах, вернитесь к своему пониманию базовой системы (в конечном итоге до уровня ассемблера).
The
finallyблок всегда выполняется (если была выполнена соответствующая попытка), поэтому перед тем, как метод вернет 5, как вcatchблок, он выполняетfinallyблок и возвращает 10.
блок 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();}он не должен использоваться для возврата чего-либо. вы можете использовать за пределами.
