黑马程序员技术交流社区

标题: try中的return语句与finally语句执行先后的问题 [打印本页]

作者: 崔湖尧    时间: 2014-6-20 11:20
标题: try中的return语句与finally语句执行先后的问题
本帖最后由 崔湖尧 于 2014-6-21 12:58 编辑

在try中写了return,后面又写了finally,是先执行return还是先执行 * fianlly?
代码测试如下:
  1. class TestDemo {

  2. public static void main(String[] args) {
  3. orderTest();
  4. }

  5. public static int orderTest() {
  6. try {
  7. return systemOutput("Return");
  8. } finally {
  9. systemOutput("Finally");
  10. }
  11. }

  12. private static int systemOutput(Object obj) {
  13. System.out.println(obj);
  14. return 0;
  15. }
  16. }
复制代码
运行结果为:
Retrun
Finally
很显然,return语句先执行。

我们已经知道return语句先执行,那么fianlly中的语句是否会改变return语句中的变量的值呢?
代码如下:
  1. class TestDemo {

  2.         public static void main(String[] args) {
  3.                 System.out.println(isFinallyStatementsExecuteFirst());
  4.         }

  5.         private static boolean isFinallyStatementsExecuteFirst() {
  6.                 boolean finallyStatementsExecute = false;
  7.                 try {
  8.                         return finallyStatementsExecute;
  9.                 }finally {
  10.                         finallyStatementsExecute = true;
  11.                 }
  12.         }

  13. }
复制代码
运行结果为false,就是fianlly中的主句不能改变return中变量的值。

问题又来了,如果在finally语句中也加入return语句,结果会怎样呢?
在finally语句中加入:return ture语句。
结果为true。也就是说,finally中的return语句覆盖了try中的return。

我想知道这些操作在内存中是怎样进行的?栈中,堆中?

作者: 人心如水    时间: 2014-6-20 12:25
同求,,,,
作者: 姿_`态    时间: 2014-6-20 12:49


作者: rover0321    时间: 2014-6-20 21:47
我更奇怪的是为什么执行了return语句还能执行finally代码块中的语句。这点,我感觉跟C++很不一样。
作者: iWilliam    时间: 2014-6-20 21:59
介个,毫无疑问,必须先执行finally,最后执行return,因为一旦return,程序(或者方法)便终止了
你的这个列子很有迷惑性,关键就在于这句
return System.out.println("Return");
由于println没有返回值,事实上它等价于:
System.out.println("Return");
return;

假如是这样的:
return a+b;
就很好理解了,
先算了a+b(假如为c)
然后执行了finally代码块
最后把c返回。

作者: 千曲生    时间: 2014-6-20 23:22
首先明确一点:一般情况下都是先执行finally语句中的语句,最后执行return语句,finally在return之前执行,除非没有return语句被执行:像:
  1. public int method()
  2. {
  3.          int a=9;
  4.          try{
  5.                  int b=a/0;
  6.          }catch(Exception e)
  7.          {}
  8.          finally
  9.          {
  10.                  System.out.println("没有输出return");
  11.                  exit();
  12.                  return a;
  13.          }
  14. }
复制代码

类型的,但这只是特殊情况,一般都是finally在return之前执行




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2