Exception handling 使用try-catch和finally返回值

Exception handling 使用try-catch和finally返回值,exception-handling,try-catch,Exception Handling,Try Catch,我需要解释下面的代码 public class ReturnValueFromTryCatchFinally { public static void main(String[] args) { System.out.println(methodReturningValue()); } static String methodReturningValue() { String s = null; try

我需要解释下面的代码

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


这不仅发生在字符串中。即使我从try块返回整数,也会发生这种情况

s中的finally将被更改,但它不会影响try返回的内容。 当您在finally中更改s时,s只会用新文本指向内存中的另一个区域。但是try中的返回已经指向try中的文本,这不会改变

也许这样更容易理解。Java中的字符串是不可变的。如果更改字符串变量,则内存中以前的文本不会更改。相反,将创建一个新文本,变量仅“指向”新文本。在finally块中,您只需更改s指向的位置,就不能更改try块的文本

如果您有其他类型,如List和finally块中添加或删除了元素,这将影响try返回的内容

我想你只是简化了代码的可读性。对吗?因为在try块中,不可能出现异常,并且由于catch块,此代码将无法编译

  • 是的,最终块将始终执行
  • 那么s的值不会改变吗? 因为字符串是不可变的,所以try块中的
    s
    与finally块中的
    s
    不同。当
    s=s+“从最终块返回值”时已分配新内存。try块中的
    返回
    仍然引用旧的
    s
  • 您可以尝试相同的代码,但使用可变对象

    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");
        }
    }
    
    static ArrayList methodReturningValue()
    {
    ArrayList arr=新的ArrayList(5);
    尝试
    {
    arr.add(“try”);
    返回arr;
    }
    捕获(例外e)
    {
    arr.add(“catch”);
    返回arr;
    }
    最后
    {
    arr.add(“最终”);
    }
    }
    
  • @门塔勒格

    所以,如果它以这种方式为字符串工作。为什么下面的程序也从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。

    @My Nguyen请检查我下面的答案,其中有一个示例,我尝试使用整数类型返回。在“try”块中,您已经将值1传递给了返回部分。如果以后更改变量“i”,则它没有效果。如果你看以下内容,可能更容易理解:试试。。。i=1;剂量测定法(i);最后i=3;这里,方法“doSomething”获得值1。如果你以后改变“i”,它没有效果。当执行“return”时,它类似于此函数调用。同样,您的代码是不可编译的。我认为这只是一种简化,假设在尝试部分中抛出一个异常。@ MeTalAlurg,请给我一个示例代码。“finally”可以更改“try”中返回的内容的示例?我已经在第一个答案中描述了它,“My Nguyen”甚至提供了我所描述的代码。@Sushm为了简单起见,您可以理解,在执行finally块后,return语句将被延迟,但它仍然指向指定的内存。在第二个示例中,最后一个
    return
    语句永远不会到达,因为在它执行finally块之后,程序返回try块中的return语句并返回。如果要返回3,请在finally blockCorrect中添加该返回。我在上面提到了名单。您甚至已经用代码说明了这一点。做得好。