Member 11391797 Ответов: 1

Возвращаемое значение в блоках try catch finally в java


Мне нужно объяснение для приведенного ниже кода.

    public static void main(String[] args)
    {
        System.out.println(methodReturningValue());
    }

    static String methodReturningValue()
    {
        String s = null;
        try
        {
            s = "return value from try block";
            return s;
        }
        catch (Exception e)
        {
            s = s + "return value from catch block";
            return s;
        }
        finally
        {
            s = s + "return value from finally block";
        }
    }
}
public class ReturnValueFromTryCatchFinally
{


Что я уже пробовал:

Я понимаю, что finally block будет выполняться всегда и так, что значение s будет "return value from try block return value from finally block". Но приведенный выше код дает мне значение s из блока try. i.e; возвращаемое значение из блока try. Почему значение s возвращается из блока try? Насколько я знаю, блок Finally всегда будет выполняться. Так не изменится ли значение s? Есть ли что-нибудь, что мне нужно понять о области действия переменной внутри блока try, catch?

Richard MacCutchan

Потому что вы используете return в блоке try. И предложение finally выполняется после окончания блока try. Используйте свой отладчик, чтобы увидеть фактическую последовательность событий.

1 Ответов

Рейтинг:
5

Dave Kreskowiak

Строки неизменны. Однажды созданные, они не могут быть изменены. В ваших операторах "s = s +" вы выделяете новую строку с результатом операции.

В блоке Try вы выделили строку" return value from try block". Затем вы нажимаете указатель на эту строку в стеке с помощью оператора return.

Теперь, в вашем блоке Finally, вы соединяете две строки вместе, а затем ничего не делаете с результирующей строкой. Помните, что указатель на исходную строку-это то, что было помещено в стек для возврата вызывающему объекту, а не "значение s" или указатель на новую строку.

Теперь, если вы попытаетесь поместить оператор return в блок Finally, вы обнаружите, что не можете этого сделать.

Правильный способ сделать это-не помещать возвраты в блоки Try и Catch, а полностью блокировать try/catch/finally.

public static void main(String[] args)
{
    System.out.println(methodReturningValue());
}

static String methodReturningValue()
{
    string s = null;

    try
    {
        s = "return value from try block";
    }
    catch (Exception e)
    {
        s = s + "return value from catch block";
    }
    finally
    {
        s = s + "return value from finally block";
    }

    return s;
}

Да, я один из тех людей, которые придерживаются парадигмы "один оператор возврата на метод".


0x01AA

Ух ты, вот это здорово, пятерка