首页 文章

用try catch返回值,最后

提问于
浏览
3

我需要解释下面的代码 .

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";
        }
    }
}

我的理解是最终块将始终执行,因此s的值将是“从最后块的try块返回值返回值” . 但是上面的代码给出了try块的s值 . 即;从try块返回值 . 为什么s的值从try块返回 . 据我所知,最后块将始终执行 . 那么s的 Value 不会改变吗?在try,catch块中有关于变量范围的任何我需要理解的东西 .

这不仅发生在字符串上 . 即使我从try块返回整数,它也会发生 .

3 回答

  • 0

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

    用这种方式可能更容易理解 . Java中的字符串是不可变的 . 如果更改字符串变量,则内存中的上一个文本不会更改 . 而是为新文本创建一个新变量文本"points" . 在 finally 块中,只需更改 s 指向的位置,即可更改 try 块的文本 .

    如果您有其他类型的List,并且在 finally 块中添加或删除了元素,则会影响 try 返回的内容 .

    我认为你只是简化了代码的可读性 . 对?因为在 try 块中没有异常是可能的,并且由于 catch 块,此代码将无法编译 .

  • 0
    • 是,最后将始终执行块 .

    • 那么s的 Value 不会被改变吗?因为String是不可变的,所以try块中的 s 与finally块中的 s 不同 . 分配 s = s + "return value from finally block"; 新内存时 . try块中的 return 仍然引用旧的 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");
        }
    }
    
  • 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 .

相关问题