2015-07-21 51 views
4

当尝试在Java执行以下功能:尝试-finally块澄清

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进行打印。任何想法为什么?

+2

'return'将取代其他任何更改。此外,无论如何,您对'x'所做的任何更改都不会在方法之外看到。你们很多人也想研究post和pre增量之间的差异 – MadProgrammer

+0

@MadProgrammer:Post/pre对上面的代码没有任何影响。 –

+0

@TJCrowder不在上面的代码中,但是如果OP试图在'finally'块中做'return x ++;',那么它会这么做;} – MadProgrammer

回答

4

最后一个块总是执行,但你返回了try块本身的值。 x的值返回后,xfinally中增加。

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

注:只是用于测试,如果你有try-catch-finally玩,只是返回在最后(不推荐),看看。

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 
5

...期望6进行打印。任何想法为什么?

x++发生后的值5已经从x读取。请记住,在return声明后面有一个表达式。当达到return声明时,该表达式是评估(它的值已确定),然后该结果值用作函数的返回值。所以在myfunc,这里是发生什么的顺序:

  1. 输入try块。 (例如,获得值x)。
  2. 将该值设置为函数的返回值。
  3. 输入finally块。
  4. 递增x
  5. 退出使用从第3步:

所以,当我们离开这个函数的返回值,即使x6函数,返回值是较早确定。递增x不会改变这一点。

你在myfunc代码类似于此:

int y = x; 
x++; 

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

它可能与功能更加清楚:假设foo函数输出"foo",并返回图5,以及bar函数输出"bar",那么这个代码:

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

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

-2

x的值从myfunc()返回,然后在finally块中增加。

-1

只是一个加法和别人的答案跛脚版本

让我们看看下面这个例子:

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

这仅仅是为了更好的可理解性和return同步的示例程序,tryfinally。然而,还必须考虑到的事实,非常鲜明提供:

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

谢谢,希望它有帮助。

P.S: - 部件并联,还必须考虑接受这里的答案,如果你觉得任何人的密切协助或彻底解决您的查询

+0

'return'不会'取代'任何东西。相关的事实是* return-expresssion *已经在'finally'block执行前被评估过了。 – EJP

+0

我刚才提到另一个人的评论,解释说即使有'finally',return也会执行并首先执行它的职责@ EJP。换句话说,“只要你有什么TOLD',可能是'SUPERCE'并不是最接近完美的词 – mustangDC

+0

@EJP:除了'SUPERCEE'这个词以外,我有没有犯错?请纠正我,我会很乐意这样做, – mustangDC