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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贠(yun)靖 高级黑马   /  2012-3-13 23:01  /  1790 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo
{
        public static void main(String[] args)
        {
                try
                {
                        func();
                       
                }
                catch (Exception e)
                {
                        System.out.println("c");
                }
                System.out.println("d");
        }
        public static void func()
        {
                try
                {
                        throw new Exception();
                        System.out.println("a");
//虽然执行不到这条语句,但是catch捕获了了啊,可以执行catch中的语句啊
        怎么编译失败呢?提示是 无法访问try里面的System语句,为什么?
       
                }                                                        //                catch (Exception e)
                {
                        System.out.println("b");
                }
               
        }
}

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 李晓旭 于 2012-3-13 23:36 编辑

java虚拟机的编译规则规定
return,continue,break,throw等语句,在没有任何判断条件下
顺序执行的话,下方不能有其他语句,因为无论如何也不会运行到

换一种方法解释,就是说try{}里面一般是写一些有可能抛出异常的语句,但是你写了throw,就是说一定会抛出这个异常
而抛出异常后,系统下面要执行的就是从catch以后的语句了,所以那句Sop是完全运行不到的

如果你要非想执行可以使用一下格式
try{  .......   }
catch (Exception e){ ......... }
finally{  把一定想要执行的代码写在其中  }

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
程序执行到  throw new Exception() 就抛出了异常,下一句就会执行catch{} 中的语句, throw new Exception() 之后的语句就不执行了,所以 下面的system.out.println("a") 无法访问到,throw new Exception() 的作用类似 return 。
回复 使用道具 举报
李晓旭 发表于 2012-3-13 23:24
java虚拟机的编译规则规定
return,continue,break,throw等语句,在没有任何判断条件下
顺序执行的话,下 ...

这些我知道   关键是捕获了   哦,好像想明白了,异常代码放在这些下面  是捕获不到的吧  
   
回复 使用道具 举报
恩,就是说throw让错误100%出现,所以try的作用已经达到了,后面再写什么也没用了,下面就是catch的事了
回复 使用道具 举报
本帖最后由 王亚男 于 2012-3-14 00:40 编辑
贠(yun)靖 发表于 2012-3-13 23:33
这些我知道   关键是捕获了   哦,好像想明白了,异常代码放在这些下面  是捕获不到的吧  
    ...


执行throw语句的时候就已经跳到catch里面去捕获了,所以下面的语句肯定执行不到,所以不可行。
但如果你把那句throw new Exception();封装到一个方法体中,然后在try中执行该方法体,下面再加上打印语句的话,编译就可以通过了。当然,下面那句还是执行不到。既然是Exception异常,方法体上还是要声明的。
这个问题在第10天的“练习四”中毕老师有详细介绍的,第13题和16题就是典型例子。
回复 使用道具 举报
王亚男 发表于 2012-3-14 00:37
执行throw语句的时候就已经跳到catch里面去捕获了,所以下面的语句肯定执行不到,所以不可行。
但如果你 ...

我知道,可能我没表达清楚,我想知道的是
      public static void func()
        {
                try
                {
                        throw new Exception();   这抛出异常了                     
                        System.out.println("a");
        
                } catch (Exception e)  这捕获到异常了,那么这个方法就执行完了啊,但是怎么到System。
                {                               out。println(“a”)这就编译出错了? 直接都从它的上一句就跳到
                        System.out.println("b");    catch这里面了。我觉得跟它没关系啊  就是这想不同,为什么
                }                                            会编译失败呢?
               
        }
}
回复 使用道具 举报
王亚男 黑马帝 2012-3-14 09:06:42
8#
本帖最后由 王亚男 于 2012-3-14 09:13 编辑

呵呵~我也觉得我可能理解错了。这样说吧:
如果你在计算一个数据,上面数据出现了问题,抛出了异常,那么可能会导致下面的结果也是错误的。所以,异常下面的语句就不能执行。
如果真有执行的必要性可以放在finally中。
即使你捕获到这种异常了,但如果异常是你本类功能所不能弥补的,那么即使捕获了异常,也只能抛出另外一个异常。
就像毕老师视频中所说的,你给一个人打钱,正常情况下对方是可以接收到的,然后反馈给你一个“转账成功”的信息,也就是相当于你异常下的那个语句s.o.p("a");(因为正常情况下异常也是需要判断的)。结果可能因为某种异常,你没打过去。这时候这异常被捕获了,然后钱又退给你了。但这时就不能再执行“转账成功”的反馈信息,而是提醒你这次转账是失败的,需要重转。
而如果你打钱的时候,一定转不过去。也就是本例func()方法中,一定会抛出异常,那下面的语句就不可以执行,即使捕获了,也不可以执行。

也就是说,当你使用throw语句时,只有出现 没有异常,或者异常不属于上面那种 这种可能,才会执行下面的语句。

不知道这样说能不能解决你的问题~~?或者我有没有会错意。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马