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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ぺsimon☆ 中级黑马   /  2013-4-18 17:57  /  1462 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Demo
  2. {
  3.         public static void func()
  4.         {
  5.         try
  6.         {
  7.         throw new Exception();
  8.         System.out.println("a");
  9.         }
  10.         catch(Exception e)
  11.         {
  12.         System.out.println("b");
  13.         }
  14.         }
  15.         public static void main(String[] args)
  16.         {
  17.         try
  18.         {
  19.         func();
  20.         }
  21.         catch(Exception e)
  22.         {
  23.         System.out.print("c");
  24.         }
  25.         System.out.print("d");
  26.         }
  27. }
复制代码
上面的程序会编译失败,因为打印"a"输出的语句执行不到
为什么这句话System.out.println("a");执行不到程序就会编译失败呢?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

8 个回复

倒序浏览
  throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
因此 你的System.out.println("a"); 代码要放到 throw new Exception(); 前面,而不能放到后面 。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
throw new Exception();抛出异常,表示发生异常了,必须进行处理,此时try语句中剩余的代码就不会执行了。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 gerenvip 于 2013-4-18 18:22 编辑

楼主问的为什么System.out.println("a");执行不到,系统会提示编译失败呢,简单点这样说吧,
我们知道当我们抛出异常后,系统就会转向异常处理,而不再按原本程序顺序执行了。跟在后面的语句是执行不到的,就像循环中如果使用了break语句,后面的语句也执行不到一样。既然执行不到,那就是废话了。编译不通过,形象点说,一方面是系统向你提示,这是一句废话,执行不到。另一方面,提示你,你可能程序书写错误了,编译不通过,希望你能检查下。。有时想想,jvm挺人性化的,呵呵。
希望能够帮助到你。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
class Demo

{

        public static void func() throws Exception//编译失败是因为这里没有写throws Exception

        {

        try

        {

        throw new Exception();

        System.out.println("a");

        }

        catch(Exception e)

        {

        System.out.println("b");

        }

        }

        public static void main(String[] args)

        {

        try

        {

        func();

        }

        catch(Exception e)

        {

        System.out.print("c");

        }

        System.out.print("d");

        }

}
因为函数中抛了异常,函数就要声明这个函数运行起来可能有异常,要注意了。抛异常语句相当于
return的功能,虚拟机看到异常就回去找到catch语句来处理这个异常,所以编译结果应该是bcd.

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
throw new Exception();用来抛出异常,程序会在这个语句后终止,在它后面的语句就执行不到,所以在你的程序中System.out.println("a");就执行不到,throw new Exception();不是一个跳转语句,当这个语句后面还有语句时执行不到时,自然会出现错误,你可以把System.out.println("a"); 代码要放到 throw new Exception(); 前面,但这时执行的结果中不会显示c,因为你调用func()时,它最后并没抛出异常。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
我也看了那段视频 ,我认为把throw单独存在,直接抛出异常了,那下面代码是肯定执行不到了,java不允许这种编码格式 所以就报错了,如果把throw封装到方法中,方法声明异常,这样就可以编译通过了。
回复 使用道具 举报
gerenvip 发表于 2013-4-18 18:21
楼主问的为什么System.out.println("a");执行不到,系统会提示编译失败呢,简单点这样说吧,
我们知道当我 ...

大概知道什么意思了谢谢
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-20 21:44:47
9#

如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马