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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨立 中级黑马   /  2012-12-8 09:19  /  1788 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨立 于 2012-12-9 21:34 编辑

return是在finally执行后才返回的,且在finally无法改变返回值。
public static StringBuffer test() {
                StringBuffer sb = new StringBuffer("wer");
                try {
                        sb.append("_hi");
                        return sb;
                } catch (Exception e) {

                } finally {
                        System.out.println("finally");
                        sb.append("_!!!!!!");
                }
                return sb;
        }


finally里的sb.append("_!!!!!!");,为什么还是执行了?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
如果没有最后的return sb; 代码编写时会报错。所以说try块中的return是不起任何作用的。
逻辑上讲 ,try块中的语句是为了检查异常。如果在return前就发生了异常,那么这个方法就没有返回值了。编译不会通过。所以try中的return没有意义。
如果忽略了第一个return,这个程序是能看的通的。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
public static StringBuffer test() {
                StringBuffer sb = new StringBuffer("wer");
                try {
                        sb.append("_hi");
                        return sb;
                } catch (Exception e) {

                } finally {
                        System.out.println("finally");
                        sb.append("_!!!!!!");
                }
                return sb;
        }


finally里的sb.append("_!!!!!!");,为什么还是执行了?


这个就是异常体系里的一个格式,try()块里是可能发生异常的语句,catch()块是如果发生异常则被chtch语句捕获,catch()处理异常,执行catch代码块里的语句;而fianlly就是最终一定会被执行的代码,所以,finally代码块里的语句,肯定会被执行一遍的;
这就是规定吧

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 吴健 于 2012-12-8 20:13 编辑

java异常处理机制不论有无异常出现finally中的代码块总会执行,即如果程序中出现异常会执行catch后的代码块,然后执行finally中的代码,如果程序中无异常产生,则直接执行
finally中的代码。
(1)不管有无异常产生,finally都会执行
(2)当try、catch语句中有return时,finally仍会执行。
(3)如果finally语句中含有return时,try,catch中的返回值将获取不到
public static String test(){
                String str = null;
                List list = new ArrayList();
                try{
                        list.get(9);
                        return "try";
                }catch(Exception e){
                        return "catch";
                }finally{
                        return "finally";        //该方法最终返回的是finally中的字符串
                }
        }
  当然finally一般用来释放占用的资源,不宜包含return语句,会使程序提前退出
(4)如果出现异常的话则会提前退出执行finally语句后在执行catch中的return,然后退出程序
public static String test(){
                String str = null;
                List list = new ArrayList();
                try{
                        list.get(9);
                        return "try";
                }catch(Exception e){
                        return "catch";   //退出程序
                }finally{
                    
                }
        }


评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
你这只会执行第一个return sb;
但是执行之前肯定会先把finally里边的语句执行了才会结束
但是执行时候不改变sb的值

finally一般用来释放资源用的

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

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