【问题标题】:How does the return work in try or catch in java? [duplicate]java 中的 try 或 catch 中的 return 是如何工作的? [复制]
【发布时间】:2020-01-24 21:49:34
【问题描述】:

根据here的回答, 据说如果我们在 try/catch 块中有 return 语句,那么在执行 return 语句之前 finally 块将被执行。

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

输出

在try块中,值为:20

在 finally 块中,值为:40

在main方法中,值为:20

在 try 块返回值之前,'x' 的值在 finally 中设置为 40。但这会将 x 的值作为 20 而不是 40 返回给 main 方法。

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

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());
}

}

【问题讨论】:

  • 你不会从finally返回,这就是为什么变量保留在main中分配的值。如果你也从finally 返回它,它将是 40
  • 我发誓我在一周前看到了 exact 同样的问题。
  • 是的here 是问题所在。完全相同的场景。基本上改变x的值不会改变已经调用的x上的返回值。
  • 那句话是真的,它仍然在执行 finally,但是这个finally改变了x 的值。 return 已经使用 x 来获得它需要的价值!它不会再看x。在 finally 执行完成后,return 将“完成”将值从以前带回。如果您在 finally 块中执行了return x 然后,则该值将被覆盖,因为return 本身已被覆盖。 return 返回的是 value 而不是 variable,也许这就是你感到困惑的原因。
  • @Ankit 关键是 return 语句返回 表达式 的值,而不是变量。您可以写return 1;return someMethod();。这些结果没有存储在变量中(它们只是保存在堆栈中),因此没有机会通过在 finally 中执行某些操作来更新它们的返回值。如果return x; 有任何不同,那就太奇怪了。

标签: java exception try-catch-finally


【解决方案1】:

这被描述为in JLS 14.20.2,“try-finally 和 try-catch-finally 的执行”:

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

  • 如果 try 块的执行正常完成,则执行 finally 块,然后有一个选择:​​i>

您的 try 块没有正常完成,它在 return 处突然完成,所以这不适用。

  • 如果由于抛出值 V 而导致 try 块的执行突然完成,则可以选择:​​i>

你不扔,所以这也不适用。

  • 如果 try 块的执行由于任何其他原因突然完成 R,则执行 finally 块,然后有一个选择:​​i>

这适用。

  • 如果 finally 块正常完成,则由于原因 R,try 语句会突然完成。

您的 finally 块正常完成(您不会从 finally 返回或抛出 - 这样做是不好的做法),因此您的 try 语句完成的原因是 R。

那个 R 是你在计算 return 语句的表达式时返回了 x 的值。

你可以在JLS 14.17找到这个:

带有表达式的 return 语句尝试将控制权转移给方法的调用者或包含它的 lambda 主体;表达式的值成为方法调用的值。 ...如果表达式的评估正常完成,产生值 V,则返回语句突然完成,原因是返回值 V。

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

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 2013-11-14
    • 2020-03-18
    • 1970-01-01
    • 2012-05-26
    • 2010-11-27
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多