黑马程序员技术交流社区

标题: finally中的语句是执行在return前还是return后? [打印本页]

作者: 罗全涛    时间: 2011-12-28 10:37
标题: finally中的语句是执行在return前还是return后?
本帖最后由 罗全涛 于 2011-12-28 20:03 编辑

finally中的语句是执行在try中的return前还是return后?还有finally中当加上return是报错了为什么?
作者: 祁焱    时间: 2011-12-28 11:44
finally中的语句是执行在try中的return前还是return后,你可以用一下代码测试一下:
public static void main(String[] args) {
        int temp=0;
        try
        {
            temp=1;
            return;
            
            
        }
        catch (Exception e) {
        }
        finally
        {
            System.out.println(temp);
        }
运行结果:temp=1;所以finally中的语句是执行在try中的return之前。finally中加上return我在Netbeans上运行没有报错,不知道你用的什么工具。
作者: 王胜利    时间: 2011-12-28 13:00
先执行return语句,再执行finally语句,然后将结果返回,也可以说return语句执行了两次,一次在finally之前,一次在finally之后,但是返回的确实第一次执行的值。
例子
public class Demo{

public static void main(String args[]){

int num = 10;

System.out.println(test(num));

}

public static int test(int b){

try{

b += 10;

return b;

}catch(RuntimeException e){

}catch(Exception e2){

}finally{

b += 10;

}

return 0;

}

}


作者: 1253431283    时间: 2011-12-28 14:21
先执行return语句,再执行finally语句,finally是最后无论如何倒要执行的代码片段。比如当你和数据库连接的时候,你出现了错误,但是在finally的代码块里面你必须吧占用系统资源的内存释放掉
作者: 张帅    时间: 2011-12-28 14:35
1253431283 发表于 2011-12-28 14:21
先执行return语句,再执行finally语句,finally是最后无论如何倒要执行的代码片段。比如当你和数据库连接的 ...

关于finally 中return 出错,没听懂,还请讲解下
作者: 1253431283    时间: 2011-12-28 14:40
比如说你在使用JDBC操作数据库是你的用Connection类来打开关闭数据库的连接,之后使用Stattement或者PreparedStatement来执行SQL语句,当你在在执行操作sql语句的时候可能出现错误,无论是否能成功的返回你想要的数据结果,你都得在finally里面把数据库所占用的数据库连接关闭
作者: 1253431283    时间: 2011-12-28 14:40
张帅 发表于 2011-12-28 14:35
关于finally 中return 出错,没听懂,还请讲解下

比如说你在使用JDBC操作数据库是你的用Connection类来打开关闭数据库的连接,之后使用Stattement或者PreparedStatement来执行SQL语句,当你在在执行操作sql语句的时候可能出现错误,无论是否能成功的返回你想要的数据结果,你都得在finally里面把数据库所占用的数据库连接关闭
作者: 张帅    时间: 2011-12-28 15:54
1253431283 发表于 2011-12-28 14:40
比如说你在使用JDBC操作数据库是你的用Connection类来打开关闭数据库的连接,之后使用Stattement或者Prep ...

原来是这样,了解了,十分感谢
作者: 罗全涛    时间: 2011-12-28 20:01
祁焱 发表于 2011-12-28 11:44
finally中的语句是执行在try中的return前还是return后,你可以用一下代码测试一下:
public static void m ...

首先要道歉,我在公司没环境,看了别人的例子,那里说finally有return会报错。所以觉得不对,上来问问,并没有操作。还有你没明白我的意思,我说如果try和finally中都有return,并且返回值不同,最后返回谁?
我回来后马上验证了。finally中可以有return,如果try和finally中都有return,返回finally中的。
  1. class  ReturnDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int a = 0;
  6.                
  7.                 System.out.println("a:"+sop(a));
  8.         }
  9.         public static int sop(int a)
  10.         {       
  11.                 try
  12.                 {
  13.                         System.out.println("try被"+ (++a) +"执行"+","+"a:"+a);
  14.                         return a*100;
  15.                 }
  16.                 catch (Exception e)
  17.                 {
  18.                         System.out.println(e.toString());
  19.                 }
  20.                 finally
  21.                 {
  22.                         System.out.println("finally被执行"+","+"a:"+a);
  23.                         return a*10;
  24.                 }
  25.         }
  26. }
复制代码
结果:
try被1执行,a:1
finally被执行,a:1
a:10
作者: 罗全涛    时间: 2011-12-28 20:02
就此结贴吧,这问题没别要再纠结了。
作者: 颜小飞    时间: 2011-12-28 23:18
finally是在tryl中的return 之后执行的。对于你说的finally中有return 会报错。可能是你码有问题,我测试了下,这种写法是不会报错的。
作者: 罗全涛    时间: 2011-12-29 12:56
颜小飞 发表于 2011-12-28 23:18
finally是在tryl中的return 之后执行的。对于你说的finally中有return 会报错。可能是你码有问题,我测试了 ...

恩,谢谢了,
作者: 付星    时间: 2011-12-29 17:42
finally是执行在try里return 之前的,至于finally里不能写return还是因为finally是执行在try里return 之前的,如果try没有return,finally也会执行到"}"右括号这里,所以不能有




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