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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨博 中级黑马   /  2013-3-15 20:40  /  1493 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨博 于 2013-3-15 22:33 编辑
  1. class Test
  2. {
  3. public static String output="";
  4. public static void foo(int i)
  5. {
  6. try
  7. {
  8. if(i==1)
  9. throw new Exception();
  10. output+="1";
  11. }
  12. catch(Exception e)
  13. {
  14. output+="2";
  15. return;
  16. }
  17. finally
  18. {
  19. output+="3";
  20. }
  21. output+="4";
  22. }
  23. public static void main(String args[])
  24. {
  25. foo(0);
  26. System.out.println(output);
  27. foo(1);
  28. System.out.println(output);
  29. }
  30. }
复制代码
当执行foo(1)的时候,在catch中,既然遇见了return,为什么没有跳出,还执行了finally结果为3,不太理解啊,求指导?

点评

楼主,一定要对回复者做出相应的回复哦,如果问题已经解决,请尽快结贴,将分类改为“已解决”,谢谢  发表于 2013-3-15 22:12

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
异常的处理方式 try

try
{
    检测可能发生异常的代码
}
catch(异常类 变量)
{
   处理方式:调用函数,循环
}
finally
{
   一定要执行的代码
}
这是固定的,不管前面怎么样,finally里面的语句是一定要执行的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
finally块就是在程序结束前必须要执行的代码块。当catch到异常时,执行了output+=“2”;会先执行finally中的代码,然后再return。
回复 使用道具 举报
package mypack1;

class Test

{
        public static String output = "";

        public static void foo(int i)

        {
                try

                {
                        if (i == 1)

                                throw new Exception();
                        output += "1";
                } catch (Exception e)

                {
                        output += "2";
                        return;
                } finally

                {
                        output += "3";
                }
                output += "4";
        }

        public static void main(String args[])

        {
                foo(0);

                System.out.println(output);// 此时字符串 output的值得变成了"134"

                foo(1);// 遇到了异常,output += "1";不再执行。 程序流跳转到时catch块中。
                                //运行到return的时候   output="1342"
                                //遇到return,方法调用结束前,必须执行finally{}里面的语句。
                                //这时output="13423",方法调用结束。
                System.out.println(output);
        }

}

注意:try{}catch{}finally{}的执行流程。再中途不管遇到什么情况使程序流程跳转或遇到 return; 使程序结束之前,都必须执行finally{}里面的语句。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
这个要明白try catch finally的含义如下
try
{
     存放被检测异常的代码(也就是可能出现异常的代码)
}
catch(异常类   异常对象名称)
{
     异常处理代码(仅且挡且出现异常的时候执行的代码)
}
finally
{
    不管怎样一定要被执行的代码
}
finally一般用于释放资源,例如当连接数据库到时候,最后释放数据库连接放在这里面。还有接下来学习的线程同步的第二种显式加锁解锁实现线程同步,解锁的unlock也要放在finally里面,以及后面的IO流中的FileWriter和FlieReader对象关闭流的语句也要放在finally里面 。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
沈子豪 发表于 2013-3-15 20:44
异常的处理方式 try

try

懂了,非常感谢啊:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马