try-finally阻止澄清

时间:2015-07-21 06:15:40

标签: 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。知道为什么吗?

5 个答案:

答案 0 :(得分:5)

  

......预计会打印6张。知道为什么吗?

x++读取值5后,x发生了。请记住,return语句后面的内容是表达式。当达到return语句时,该表达式已计算(其值已确定),然后该结果值将用作函数的返回值。所以在myfunc中,这是发生的事情的顺序:

  1. 输入try块。
  2. 评估表达式x(例如,获取x的值)。
  3. 将该值设置为函数的返回值。
  4. 输入finally块。
  5. 增量x
  6. 使用步骤3中的返回值退出该功能。
  7. 因此,当我们离开函数时,即使x6,返回值也是之前确定的。增加x并不会改变它。

    myfunc中的代码与此类似:

    int y = x;
    x++;
    

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

    功能可能更清晰:假设foo函数输出"foo"并返回5,而bar函数输出"bar",则此代码:< / p>

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

    ...执行foo,输出"foo",然后执行bar,输出"bar",然后退出test,返回值为{{1} }}。你不希望这个函数等到5 {<1}}之后发送foo(这会很奇怪),实际上并不是这样:它在到达finally语句时调用它,因为它会计算表达式return foo();foo()也是如此:它评估表达式并记住该语句的结果。

答案 1 :(得分:4)

最后块始终执行,但您在try块本身中返回了值。在返回x的值后,xfinally中递增。

public static int myfunc (int x) {
    try {
        return x;  // returning
    } finally {
        x++;   // now incremented.
    }       
}

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

答案 2 :(得分:0)

最后执行无论什么,在这种情况下,值为5,返回然后递增x

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

答案 3 :(得分:-1)

只是其他人的补充和蹩脚版本&#39;答案

让我们考虑以下这个例子:

public class ok {

public static int foo1(int x) {
    try {
        x++;
        System.out.println("foo1 : Inside try before returning I am " + x);
        return x;
    } finally {
        x++;
        System.out.println("foo1 : Inside Finally after post Increment I am " + x);
    }
}

public static int foo2(int x) {
    try {
        x++;
        System.out.println("foo2 : I am inside another method, incremented and changed to " + x);
        return x;
    } finally {

    }
}

public static void main(String[] args) {
    ok o = new ok();
    int val = 10; // The father of all

    int z = foo1(val);
    System.out.println("After executing foo1 I am " + z);

    int x = foo2(val);
    System.out.println("After executing foo2 I am " + x);

    System.out.println("Inside main() and un-altered I am : " + val);
}
}

这只是一个示例程序,可以提高returntryfinally的可理解性和同步性。然而,您还必须考虑事实,非常明显地提供:

  • MadProgrammer 返回将取代任何其他更改。
  • RishiKesh Pathak return:立即将控件返回给其方法的调用者。最后:将永远执行。但是会等待轮到

谢谢,希望它有所帮助。

P.S: - 如果你觉得他们中的任何一个已经密切帮助或完全解决了你的问题,你也必须考虑接受答案

答案 4 :(得分:-2)

x块增加之前,myfunc()的值已从finally返回。