首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >try-finally块澄清

try-finally块澄清
EN

Stack Overflow用户
提问于 2015-07-21 14:15:40
回答 5查看 347关注 0票数 4

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

代码语言:javascript
复制
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。知道为什么吗?

EN

回答 5

Stack Overflow用户

发布于 2015-07-21 14:23:57

...would预计将打印6。知道为什么吗?

x读取值5之后,会发生x++。请记住,return语句后面的是一个表达式。当到达return语句时,将计算该表达式(确定其值),然后将结果值用作函数的返回值。因此,在myfunc中,发生的顺序如下:

输入表达式返回值(例如,获取x).

  • Set block.

  • Increment x.

  • Exit try的值作为函数的返回值。
  1. 使用步骤3中的返回值输入函数的返回值。

因此,当我们离开函数时,即使x6,返回值也是在前面确定的。递增x不会改变这一点。

您在myfunc中的代码类似于:

代码语言:javascript
复制
int y = x;
x++;

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

使用函数可能会更清楚:假设一个输出"foo"并返回5的foo函数和一个输出"bar"bar函数,则如下代码:

代码语言:javascript
复制
int test() {
    try {
        return foo();
    }
    finally {
        bar();
    }
}

...executes foo,输出"foo",然后执行bar,输出"bar",并使用返回值5退出test。您不会期望该函数等到finally发生之后才调用foo (这会很奇怪),实际上它并没有:它在到达return foo();语句时调用它,因为它计算表达式foo()return x;也是如此:它计算表达式并记住该语句的结果。

票数 5
EN

Stack Overflow用户

发布于 2015-07-21 14:16:40

最后,块总是会执行,但是您在try块本身中返回值。在返回x的值之后,xfinally中递增。

代码语言:javascript
复制
public static int myfunc (int x) {
    try {
        return x;  // returning
    } finally {
        x++;   // now incremented.
    }       
}

注意:只是为了测试,如果你使用try-catch-finally,只需返回最后(不推荐)并查看。

票数 4
EN

Stack Overflow用户

发布于 2015-07-21 14:18:14

不管发生什么,最终都会被执行,在这种情况下,返回的值是5,然后递增x

代码语言:javascript
复制
package qwerty7;

public class Stack {
    public static int myfunc (int x) {
        try {
            return x;
        } finally {
            System.out.println("I'm executing!");
            x++;
        }       
    }
    public static void main (String args[]) {
        int y=5,z;
        z = myfunc(y);
        System.out.println(z);
    }
}

Output:
I'm executing!
5
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31531629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档