Возвращение наконец
Только сегодня я помогал с некоторой ошибкой в Java и наткнулся на
интересная проблема - что произойдет, если вы используете return в try / catch
заявление? Должен ли наконец-то запускаться раздел или нет? Я упростила
проблема в следующем фрагменте кода:
Что выводит следующий код?
class ReturnFromFinally {
public static int a() {
try {
return 1;
}
catch (Exception e) {}
finally{
return 2;
}
}
public static void main(String[] args) {
System.out.println(a());
}
}
Мое первоначальное предположение было бы, что это должно распечатать 1
, я звоню
return
, поэтому я предполагаю, что один будет возвращен. Тем не менее, это не
случай:
Я понимаю логику, наконец, раздел должен быть выполнен, но
как-то мне неловко по этому поводу. Давайте посмотрим, что C # делает в этом случае:
class ReturnFromFinally
{
public static int a()
{
try {
return 1;
}
catch (System.Exception e) {}
finally
{
return 2;
}
}
public static void Main(string[] args)
{
System.Console.WriteLine(a());
}
}
Я предпочитаю гораздо больше такое поведение, поток управления не может быть перепутан с
в конечном итоге, так что это мешает нам застрелиться в
ступня. Просто для полноты давайте проверим, что еще
языки делают.
Python:
def a():
try:
return 1
finally:
return 2
print a()
JavaScript:
<script>
function ReturnFromFinally()
{
try
{
return 1;
}
catch (e)
{
}
finally
{
return 2;
}
}
</script>
<a onclick="alert(ReturnFromFinally());">Click here</a>
В C ++ и PHP нет предложения finally, поэтому я не могу опробовать последнее
два языка, для которых у меня есть компилятор / интерпретатор.
Наш маленький эксперимент хорошо показал, что C # имеет лучший подход
к этой проблеме, но я был весьма удивлен, узнав, что все
другие языки решают проблему таким же образом.