A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 崔湖尧 于 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。

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

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

5 个回复

倒序浏览
同求,,,,
回复 使用道具 举报
  • class TestDemo {
  •         public static void main(String[] args) {
  •                 System.out.println(isFinallyStatementsExecuteFirst());
  •         }
  •         private static boolean isFinallyStatementsExecuteFirst() {
  •                 boolean finallyStatementsExecute = false;
  •                 try {
  •                         return finallyStatementsExecute;
  •                 }finally {
  •                         finallyStatementsExecute = true;
  •                         return finallyStatementsExecute;//结果肯定是true
  •                 }
  •         }
  • }
  • 首先要明确的是 ,你的方法是静态的 ,那么肯定是在方法区,其实关于返回值问题,没那么复杂,你的
  • isFinallyStatementsExecuteFirst方法 返回值是boolean类型的,所以看程序内部的return语句,如果return语句在try内,那么返回就是那个return语句内容,
  • 如果try和finally内都有return语句,那么就看fianlly内的return语句,总之就看最后一个return语句。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

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

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

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
首先明确一点:一般情况下都是先执行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之前执行

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马