尝试赶上最后回报的澄清
通过阅读本论坛中已经提出的与上述主题相关的所有问题(见标题),我彻底明白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
将是最终的返回。 你同意吗?
finally
的return
不会将控制权交给程序,而是返回值并终止方法。 我们可以这样说吗?
如果try
块中的return
值达到,它将控制权交给finally
块,函数最终正常返回(不是一个throw)。
如果发生exception,但代码从catch
块return
,则控制权转移到finally
块,函数最终正常返回(不是一个throw)。
在你的例子中,你finally
有了一个return
,所以无论发生什么事,函数都会返回34
,因为finally
会有最后的(如果你愿意的话)。
虽然在你的例子中没有涉及到,但是即使你没有catch
并且在try
块中抛出了一个exception,并且没有被捕获,情况也是如此。 通过从finally
块return
,你完全抑制了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