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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海 中级黑马   /  2012-6-11 21:45  /  2496 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo

{       
        public static void func() //throws Exception  // 这个程序有点怪异了哦  
        {
                try
                {
                        throw  new Exception();
                }
                catch(Exception e)
                {
                        System.out.println("A");

                }
               

        }
        public static void main(String[] args)
        {
                try
                {
                        func();
                        System.out.println("A");
                }
                catch(Exception e)
                {
                        System.out.println("C");
                }
                System.out.println("D");
        }
}

这个程序的输出结果是AAD  为什么?  最重要的是它没有编译失败

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
你手动抛的异常catch也会抓住的。{:soso_e127:}
回复 使用道具 举报
因为主函数先走try代码块里面的语句,第一条语句是func()方法,func()方法里面try代码块的语句是声明抛出异常,这个异常直接就在方法内部解决所以走catch代码块里面的语句,输出A,之后主程序继续走,又输出一个A,因为没有发生异常,所以不走catch代码块的语句,最后输出D,所以最后结果是AAD

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报

程序相当这样:

        public static void main(String[] args)
        {
                try
                {
                    try
                     {
                             throw  new Exception();
                     }
                     catch(Exception e)     //捕捉到一个异常,执行打印“A”
                     {
                            System.out.println("A");
                       }
                        System.out.println("A");    //程序继续执行,打印“A”,并没有抛出异常
                }
                catch(Exception e)    //没有异常,这里不执行
                {
                        System.out.println("C");
                }
                System.out.println("D");    //程序继续,打印“D”,所以记过是AAD
        }
回复 使用道具 举报
通过throw抛出异常后,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。

所以当程序执行到throw的时候,会先停下来,去catch中捕获处理异常,并打印A。然后继续往下执行。继续打印A。这个时候没有异常了,最后打印D

评分

参与人数 1黑马币 +2 收起 理由
sbeeqnui1987 + 2 很给力!

查看全部评分

回复 使用道具 举报
  1. {        
  2.         public static void func()
  3.          {
  4.                  try    //异常在内部处理后,就没有再声明异常
  5.                  {
  6.                          throw  new Exception();
  7.                  }
  8.                  catch(Exception e)  //处理过程中,没有抛出任何异常
  9.                  {
  10.                          System.out.println("A");

  11.                 }
  12.                  

  13.         }
  14.          public static void main(String[] args)
  15.          {
  16.                  try
  17.                  {
  18.                          func();    //正常运行
  19.                          System.out.println("A");
  20.                  }
  21.                  catch(Exception e)     //不需要捕捉,跳过

  22.                  {
  23.                          System.out.println("C");         
  24.                  }
  25.                  System.out.println("D");  //最后执行
  26.          }
  27. }

复制代码
回复 使用道具 举报
李海 中级黑马 2012-6-11 22:10:21
7#
wyl530274554 发表于 2012-6-11 22:04

  谢谢你  
回复 使用道具 举报
李海 中级黑马 2012-6-11 22:13:04
8#
伊文龙 发表于 2012-6-11 21:54
你手动抛的异常catch也会抓住的。

  这里好像不是这个问题吧  我主要想问的是在函数内部抛出了异常  却没有在函数外部声明  编译也能通过  现在已经知道答案了  嘻嘻
回复 使用道具 举报
王超 中级黑马 2012-6-11 22:53:21
9#
这个很好理解啊!
主函数先执行try代码块里面的语句
第一条语句是func()方法,而func()方法里面try代码块的语句是声明抛出异常,然后catch语句 输出A
继续执行主函数,输出一个A
因为没有发生异常,不执行catch代码块的语句
finally 打印输出D
最后结果是AAD
回复 使用道具 举报
class Demo

{      
        public static void func() //throws Exception  // 这个程序有点怪异了哦  
        {
                try
                {
                        throw  new Exception();//抛出异常对象,new Exception(); 函数内部有catch自动处理
                }
                catch(Exception e)//处理的结果就是:打印"A"
                {
                        System.out.println("A");

                }
               

        }
        public static void main(String[] args)
        {
                try//由于调用 func()函数时候抛出的异常,被func()本身已处理.所以次try没有抛出任何异常
                {
                        func();//此函数运行完打印A,
                        System.out.println("A");//接着打印A
                }
                catch(Exception e)//由于try没有抛出异常,所以catch没有执行
                {
                        System.out.println("C");
                }
                System.out.println("D");//最后打印D
        }
                //最后结果是:A
           //                    A
          //                         D
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马