用try catch返回值,最后

时间:2018-05-26 09:30:02

标签: exception-handling try-catch

我需要解释以下代码。

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的值将是“从finally块返回值返回值”。 但是上面的代码给出了try块的s值。 即;从try块返回值。 为什么s的值从try块返回。据我所知,最后块将始终执行。那么s的价值不会改变吗?在try,catch块中,我需要了解变量范围。

这不仅适用于字符串。即使我从try块返回整数,它也会发生。

3 个答案:

答案 0 :(得分:0)

最终中的

s 将被更改,但不会影响尝试返回的内容。 当您在最终中更改 s 时, s 只会指向内存中另一个带有新文本的区域。但是,试用版中的返回已指向尝试中的文字,但这不会改变。

用这种方式可能更容易理解。 Java中的字符串是不可变的。如果更改字符串变量,则内存中的上一个文本不会更改。相反,新文本创建一个变量只是“指向”新文本。在最终块中,只需更改 s 指向的位置,就无法更改尝试块的文本。

如果您有其他类型的列表,并且在最终块中添加或删除了元素,则会影响尝试返回的内容。

我认为您只是简化了代码的可读性。对?因为在尝试块中没有例外,并且由于 catch 块,此代码将无法编译。

答案 1 :(得分:0)

  1. 是的,最后一块将永远执行。
  2. 那么s的价值不会被改变吗? 因为String是不可变的,所以try块中的s与finally块中的s不同。分配s = s + "return value from finally block";新内存时。 try块中的return仍然引用旧的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");
        }
    }
    

答案 2 :(得分:0)

@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。