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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗玉宁 中级黑马   /  2013-3-22 22:50  /  1624 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗玉宁 于 2013-3-23 20:39 编辑
  1. class Demo
  2. {
  3.         public static void func()
  4.         {
  5.                 try
  6.                 {
  7.                         throw new Exception();
  8.                         System.out.println(1);
  9.                 }
  10.                 catch (Exception e)
  11.                 {
  12.                         System.out.println(2);
  13.                 }        
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.                 try
  18.                 {
  19.                         func();
  20.                         System.out.println(3);
  21.                 }
  22.                 catch (Exception e)
  23.                 {
  24.                         System.out.println(4);
  25.                 }
  26.         }
  27.                
  28. }
复制代码
编译失败。原因是打印1的输出语句执行不到。
我知道打印1的语句执行不到,但这和在main中调用这个方法有什么关系。对于编译失败的原因有点不理解,哪位给解释一下。

点评

记得及时处理帖子哦,继续追问,或将分类改成【已解决】,谢谢  发表于 2013-3-23 18:52

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

4 个回复

倒序浏览
对的,你的代码是有问题的,你的 System.out.println(1);这句话是死语句,永远都执行不到.
我给你分析一下,首先,你的代码从main入口,然后调用了func()方法,这个时候进入func()方法,进入之后,你就手动的抛出了一个异常, throw new Exception();同时你又对这个异常进行了捕获.也就是,这个异常的语句执行完了之后就会进入catch语句中,也就是会执行 System.out.println(2);执行完勒之后,就会跳出func()这个方法,然后执行 System.out.println(3);
java代码中不允许死语句存在,也就是不允许有永远都不会执行到的语句.
所以,只要你把System.out.println(1);这句话去掉,就不会编译报错了,去掉之后,按照我刚才的分析,这个代码最后打印出来的一定是2和3.
你可以去掉System.out.println(1);这句代码试试.有不懂的再问

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
你这个代码运行的时候报错,错误不是异常,这段代码是无法执行到的代码,就是说System.out.println(1);这句话不会被执行到。主函数运行,调用func()方法,方法体里面你捕获异常后会直接执行抛出,不会再执行异常下面的语句,所以System.out.println(1);不会被执行。最后的结果得到的是2和3、

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
这是java语法中的定义把,说明java逻辑编译的能力很强,知道你那句话不能被执行,所以直接在编译的时候就让你发现问题,你在汇编下写几句不能被执行的语句就没什么事。
回复 使用道具 举报
恩,是编译的时候起个提醒作用。告诉你下面的代码任何情况下都执行不了。
我倒是有个问题,觉得输出应该是只有4.编译结果是我错了,不知道为什么呢?
try
                {
                        throw new Exception();//这个抛出异常了之后,为什么还会 执行try的catch呢?应该结束这个函数啊,直接跳出去回到主函数。主函数对于因为这个异常就不应该打印3了吧,而是直接执行catch,打印4 啊。
                }
                catch (Exception e)
                {
                        System.out.println(2);
                }        


我觉得我想法太离谱了,哈哈,求醍醐灌顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马