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 будет выполняться.