java - try-finally block 说明

标签 java try-catch-finally try-finally

<分区>

当我尝试在 Java 中执行以下函数时:

public static int myfunc (int x) {
    try {
        return x;
    } finally {
        x++;
    }       
}
public static void main (String args[]) {
    int y=5,z;
    z = myfunc(y);
    System.out.println(z);
}

控制台上打印的输出是 5,而人们期望打印的是 6。知道为什么吗?

最佳答案

...would expect 6 to be printed. Any idea why?

x++ 发生在 x 读取值 5 之后。请记住,return 语句之后是一个表达式。当到达 return 语句时,该表达式被求值(它的值被确定),然后该结果值被用作函数的返回值。所以在 myfunc 中,这是发生的顺序:

  1. 输入 try block 。
  2. 计算表达式 x(例如,获取 x 的值)。
  3. 将该值设置为函数的返回值。
  4. 输入 finally block 。
  5. 增加 x
  6. 使用第 3 步的返回值退出函数。

所以当我们离开函数时,即使 x6,返回值也确定了。递增 x 不会改变这一点。

myfunc 中的代码与此类似:

int y = x;
x++;

在那里,我们读取 x 的值(就像return x 所做的那样),将其分配给y,然后递增 xy 不受该增量的影响。函数的返回值也是如此。

函数可能更清楚:假设一个 foo 函数输出 "foo" 并返回 5,一个 bar 函数输出“bar”,然后是这段代码:

int test() {
    try {
        return foo();
    }
    finally {
        bar();
    }
}

...执行foo,输出"foo",然后执行bar,输出"bar" , 并以返回值 5 退出 test。您不希望函数等待调用 foo 直到 after finally 发生(那会很奇怪),事实上它不会t:它在到达 return foo(); 语句时调用它,因为它计算表达式 foo()return x; 也是如此:它计算表达式并记住该语句的结果。

关于java - try-finally block 说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31531629/

相关文章:

java - 如何使用java在文本文件中的特定列/索引上写入数据

java - 如何使用 jackson 序列化 transient 场?

java - 在 finally block 中,我可以判断抛出了什么异常吗?

java - Java 的 'defer' 是什么

python - finally 语句在线程中不生效

java - 尽管使用了同步,wait()和notify()仍然不可靠吗?

java - 自定义 facelet 函数是否脏?

java - 没有 catch block 仍然继续执行,没有任何警告或错误

Java Try Catch finally 没有 Catch 的 block

c# - 为什么在 finally 部分重置此变量时,在 try block 中返回变量不会更改返回值的值?