Поведение оператора 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();}
он не должен ничего использовать. вы можете использовать за пределами.