尝试赶上最后回报的澄清

通过阅读本论坛中已经提出的与上述主题相关的所有问题(见标题),我彻底明白finally总是被称为。 (从System.exit和无限循环除外)。 不过,我想知道是否在catch块中调用return ,然后从finally块中调用另一个return

例如:

 public static void main(String[]args) { int a = new TestClass().absorbeTheValue(); } int absorbeTheValue() { try { int a = 10/0; if (a > 0) return 4; } catch(Exception e) { return 45; } finally { return 34; } } 

所以在这里输出(当调用方法的时候)在任何情况下都是34。 这意味着最后总能得到运行。 我认为其他的“回报”根本没有运行。 在许多文章中,我发现最终将内容写入已经由catch子句返回的内容。 我的理解是,只要catch语句中的返回值即将被评估,控制stream就会传递给finally语句,而finally语句又会有另一个返回语句,这次返回值将被评估,而不会将控制权交还给catch语句。 这样,在运行时调用的唯一return将是最终的返回。 你同意吗?

finallyreturn不会将控制权交给程序,而是返回值并终止方法。 我们可以这样说吗?

如果try块中的return值达到,它将控制权交给finally块,函数最终正常返回(不是一个throw)。

如果发生exception,但代码从catchreturn ,则控制权转移到finally块,函数最终正常返回(不是一个throw)。

在你的例子中,你finally有了一个return ,所以无论发生什么事,函数都会返回34 ,因为finally会有最后的(如果你愿意的话)。

虽然在你的例子中没有涉及到,但是即使你没有catch并且在try块中抛出了一个exception,并且没有被捕获,情况也是如此。 通过从finallyreturn ,你完全抑制了exception。 考虑:

 public class FinallyReturn { public static final void main(String[] args) { System.out.println(foo(args)); } private static int foo(String[] args) { try { int n = Integer.parseInt(args[0]); return n; } finally { return 42; } } } 

如果你运行,而不提供任何参数:

  $ java FinallyReturn 

foo的代码抛出一个ArrayIndexOutOfBoundsException 。 但是因为finally块会return ,所以这个exception被取消了。

这是finally避免使用return一个原因。

这是一些代码,显示它如何工作。

 class Test { public static void main(String args[]) { System.out.println(Test.test()); } public static String test() { try { System.out.println("try"); throw new Exception(); } catch(Exception e) { System.out.println("catch"); return "return"; } finally { System.out.println("finally"); return "return in finally"; } } } 

结果是:

 try catch finally return in finally