Вернуть значение с помощью try catch и, наконец, - PullRequest
0 голосов
/ 26 мая 2018

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

public class ReturnValueFromTryCatchFinally
{
    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";
        }
    }
}

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

Это не только для строки.Это происходит даже тогда, когда я возвращаю целое число из блока try.

Ответы [ 3 ]

0 голосов
/ 26 мая 2018
  1. Да, наконец, блок будет выполняться всегда.
  2. Так не изменится ли значение s?Поскольку String является неизменным, то s в блоке try отличается от s в блоке finally.Когда s = s + "return value from finally block"; выделяется новая память.return в блоке try по-прежнему ссылается на старый s.
  3. Вы можете попробовать тот же код, но с изменяемыми объектами.

    static ArrayList<String> methodReturningValue()
    {
        ArrayList<String> arr = new ArrayList<String>(5);
    
        try
        {
            arr.add("try");
            return arr;
        }
        catch (Exception e)
        {
            arr.add("catch");
            return arr;
        }
        finally
        {
            arr.add("finally");
        }
    }
    
0 голосов
/ 26 мая 2018

@ mentallurg

Так что, если это работает для строки таким образом.Почему следующая программа также возвращает значение из try

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

    static int methodReturningValue()
    {
        int i = 0;

        try
        {
            i = 1;
            return i;
        }
        catch (Exception e)
        {
            i = 2;
        }
        finally
        {
            i = 3;
        }

        return i;
    }
}

Мы передаем целое число.Так что не должно возвращаться 3 вместо 1.

0 голосов
/ 26 мая 2018

s в окончании будет изменено, но это не повлияет на то, что try вернет.Когда вы изменяете s в finally , s просто укажет на другую область в памяти с новым текстом.Но return в попытке уже указывает на текст из try , и это не изменится.

Может быть, это легче понять таким образом.Строки в Java неизменны.Если вы измените строковую переменную, предыдущий текст в памяти не изменится.Вместо этого создается новый текст, переменная просто «указывает» на новый текст.В вашем блоке finally вы просто меняете, куда указывает s , вы не можете изменить текст блока try .

Если у вас был другойвведите List и добавьте или удалите элементы finally , это повлияет на то, что try возвращает.

Я думаю, вы просто упростили код для удобства чтения.Правильно?Поскольку в блоке try исключение невозможно, и этот код не будет компилироваться из-за блока catch .

...