在java中,try或catch中的返回是如何工作的?

在java中,try或catch中的返回是如何工作的?,java,exception,try-catch-finally,Java,Exception,Try Catch Finally,根据答案,, 据说,如果在try/catch块中有return语句,那么在执行return语句之前,将执行finally块 但我看到以下代码的一些意外输出: 输出 在try块中,值为:20 在finally块中,值为:40 在主方法中,值为:20 在从try块返回值之前,“x”的值在finally中设置为40。但这是将x的值返回到main方法中的20,而不是40 有人能解释一下,它是如何在内部工作的吗 class ExceptionTest { private static int return

根据答案,, 据说,如果在try/catch块中有return语句,那么在执行return语句之前,将执行finally块

但我看到以下代码的一些意外输出:

输出

在try块中,值为:20

在finally块中,值为:40

在主方法中,值为:20

在从try块返回值之前,“x”的值在finally中设置为40。但这是将x的值返回到main方法中的20,而不是40

有人能解释一下,它是如何在内部工作的吗

class ExceptionTest
{
private static int returnValue() {
    int x = 10;
    try {
        x=20;
        System.out.println("In try block, value is : " + x);
        return x;
    } 
    finally {
        x = 40;
        System.out.println("In finally block, value is : " + x);
    }
}
public static void main (String[] args) throws java.lang.Exception
{
    System.out.println("In main method, value is : " + returnValue());
}
}

这被描述为“执行try finally和try catch finally”:

带有finally块的try语句通过首先执行try块来执行。还有一个选择:

  • 如果try块的执行正常完成,则执行finally块,然后有一个选择:
您的try块不能正常完成,它在返回时突然完成,因此这不适用

  • 如果try块的执行由于抛出值V而突然完成,则有一个选择:
你不扔,所以这也不适用

  • 如果try块的执行由于任何其他原因突然完成,则执行finally块,然后有一个选择:
这是适用的

  • 如果finally块正常完成,那么try语句由于原因R而突然完成
您的finally块正常完成(您不会从finally返回或抛出,这样做是不好的做法),因此您的try语句完成的原因是R

R是在计算return语句的表达式时返回的
x

您可以在以下内容中找到:

带有表达式的return语句试图将控制权转移到包含它的方法或lambda体的调用方;表达式的值成为方法调用的值。。。如果表达式的求值正常完成,并生成一个值V,那么return语句会突然完成,原因是返回值为V


您随后是否覆盖它并不重要:原因R(“返回值V”)是在执行finally之前确定的,因此这也是finally块突然完成的原因。

您没有从
finally
返回,这就是变量保留在
main
中赋值的原因。如果你最后也从
返回它,它将是40,我发誓我在一周前看到了完全相同的问题。是的,就是这个问题。完全相同的情景。基本上,更改
x
的值不会更改已调用的
x
的返回值。该语句是正确的,它仍在执行finally,但此
finally
块仅更改
x
的值。
return
已使用
x
获取所需的值!它将不再查看
x
。在执行finally之后,
返回将“finish”从前面返回值。如果在finally块中执行了
返回x
,则该值将被覆盖,因为
返回
本身被覆盖。
return
返回的是值而不是变量,可能这就是您感到困惑的原因。@Ankit关键是return语句返回的是表达式的值,而不是变量。您可以编写
返回1
返回somethod()。这些结果不存储在变量中(它们只是保存在堆栈中),因此它们的返回值不可能通过在finally中执行某些操作来更新。如果
返回x,则会很奇怪且不一致有什么不同。