Try-catch-finally с возвратом после него
Я знаю, как пытаюсь, ловить и, наконец, работать (по большей части), но у меня есть одна вещь, о которой мне было интересно: что происходит с оператором return после try-catch-finally, в то время как у нас уже было возвращение в попытке (или улов)?
Например:
public boolean someMethod(){
boolean finished = false;
try{
// do something
return true;
}
catch(someException e){
// do something
}
finally{
// do something
}
return finished;
}
Скажем, в попытке ничего не случилось, поэтому мы вернулись. Затем мы вернемся к тому, где мы делаем что-то вроде закрытия соединения, а затем?
Будет ли метод останавливаться после того, как мы в конце концов выполнили некоторые вещи (поэтому метод вернул true в try), или метод продолжит работу после окончательного повторения, в результате чего завершение возвращается (что является ложным)?
Заранее благодарим за ответы.
Ответы
Ответ 1
Тот факт, что блок finally выполняется, не заставляет программу забыть о возврате. Если все пойдет хорошо, код после блока finally не будет выполнен.
Вот пример, который дает понять:
public class Main {
public static void main(String[] args) {
System.out.println("Normal: " + testNormal());
System.out.println("Exception: " + testException());
}
public static int testNormal() {
try {
// no exception
return 0;
} catch (Exception e) {
System.out.println("[normal] Exception caught");
} finally {
System.out.println("[normal] Finally");
}
System.out.println("[normal] Rest of code");
return -1;
}
public static int testException() {
try {
throw new Exception();
} catch (Exception e) {
System.out.println("[except] Exception caught");
} finally {
System.out.println("[except] Finally");
}
System.out.println("[except] Rest of code");
return -1;
}
}
Вывод:
[normal] Finally
Normal: 0
[except] Exception caught
[except] Finally
[except] Rest of code
Exception: -1
Ответ 2
Если все пойдет хорошо, возврат внутри try
выполняется после выполнения блока finally
.
Если что-то пойдет не так внутри try
, exception
поймано и выполнено, а затем выполняется блок finally
, а затем возвращается после этого.
Ответ 3
В этом случае код внутри finally запускается, но другой возврат пропускается, когда нет исключений.
Вы также можете увидеть это сами, зарегистрировав что-то:)
Также см. это в отношении System.exit
:
Как работает System.exit() Java с блоками try/catch/finally?
И вернемся к окончанию:
Возврат из блока finally в Java
Ответ 4
public int Demo1()
{
try{
System.out.println("TRY");
throw new Exception();
}catch(Exception e){
System.out.println("CATCH");
}finally{
System.out.println("FINALLY");
}return 0;
}
вывод вызова этого метода похож на этот
TRY
CATCH
FINALLY
0
Средство Рассмотрим Try{}catch{}finally{}
как последовательность операторов, выполняемых один за другим. В этом конкретном случае.
А контроль возвращается.
Ответ 5
Определенно, код внутри try будет выполняться.. но когда он достигнет инструкции return, он переместится в блок finally без выполнения оператора return в блоке try.., а затем код finally будет выполнен, а затем return будет выполняться.