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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 段应腾 中级黑马   /  2012-7-23 17:49  /  2369 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、class Demo
{
        public static void main(String[] args)
        {
                try
                {
                        showExce();
                        System.out.println("A");
                }
                catch(Exception e)
                {
                        System.out.println("B");
                }
                finally
                {
                        System.out.println("C");
                }
                System.out.println("D");
        }
        public static void showExce()throws Exception
        {
                throw new Exception();
        }
}

2、class Demo
{       
        public static void func()
        {
                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.println("C");
                }
                System.out.println("D");
        }
}
这两个程序有什么不同、为什么执行结果会不一样、求解、尤其是第二个程序......

9 个回复

正序浏览
肖琦 中级黑马 2012-7-23 23:04:21
9#
主要说第2个Demo,首先注释掉func中的System.out.println("A");,因为编译通不过。
func中你制造的异常已经被捕获,所以对func的调用者来说,func是正常返回的,没有发生异常,当然不会进入main方法中catch块.
希望对你有帮助.....
回复 使用道具 举报
李菁 中级黑马 2012-7-23 19:57:14
8#
1、class Demo
{
        public static void main(String[] args)
        {
                try
                {
                        showExce();
                        System.out.println("A");  try发现异常的话,这句语句就不执行了,走到catch进行异常处理
                }
                catch(Exception e)
                {
                        System.out.println("B");  try、里发现异常,catch块进行处理
                }
                finally
                {
                        System.out.println("C");   finally的语句是无论如何都要被执行的
                }
                System.out.println("D");  异常处理结束,程序正常往下走,执行这条语句
        }
        public static void showExce()throws Exception
        {
                throw new Exception();
        }
}
第一段代码输出结果是B、C、D

2、class Demo
{        
        public static void func()
        {
                try
                {
                        throw  new Exception();
                        System.out.println("A");   抛出异常跳过try里的语句,进入catch
                }
                catch(Exception e)
                {
                        System.out.println("B");   异常处理,输出B
                }
        }
        public static void main(String[] args)
        {
                try
                {
                        func();   调用上面的func方法
                }
                catch(Exception e)
                {
                        System.out.println("C");  没有异常,所以不进入catch
                }
                System.out.println("D");  try-catch结束,正常输出D
        }
}
第二段代码输出结果为:B、D
回复 使用道具 举报
rslheima 发表于 2012-7-23 18:03
class Demo
{        
        public static void func()

呵呵,你运行过吗?我的结果是我说的那样。
回复 使用道具 举报
1、class Demo
{
        public static void main(String[] args)
        {
                try                  ①
                {   //try一发现有异常,那就不运行try里面的代码块了,它只是检测机构,赶紧把它检测到的异常抛给catch处理公司,让专业人士处理 就到了②
                        showExce();               
                        System.out.println("A");  //  就跳过了A,这里没有执行
                }
                catch(Exception e)       ②    catch公司的专业人士解决之后,那就继续往下执行   就到了③
                {
                        System.out.println("B");
                }
                finally               
                {
                        System.out.println("C");
                }
                System.out.println("D"); //最后问题排除了,安全了,就输出打印了B,C,D
        }
        public static void showExce()throws Exception
        {
                throw new Exception(); //在调用的时候抛出了异常,所以就被try检测到了 就到了①
        }
}
-----------------------------------------------------
2、class Demo
{        
        public static void func()    ①      
        {
                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.println("C");
                }
                System.out.println("D");
        }
}

ttttt.JPG (74.05 KB, 下载次数: 74)

ttttt.JPG

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
田向向 + 1 很给力!
魏-玉-彪 + 2 很给力!

查看全部评分

回复 使用道具 举报
第一个程序showExce()方法抛出异常,被catch语句捕获,而finally语句是一定会执行的,所以第一个程序打印结果是BCD。
第二个程序:主方法先执行func方法。而func方法try块中虽然会抛出异常,但是会被catch块所捕获,方法内部自己将异常处理掉了,方法本身不会再抛出异常。所以主方法中执行的func()方法不会再抛出异常。打印结果为BD。还有func()方法中的 System.out.println("A");语句不可能被执行,因为出现异常后的代码不会被执行,此时编译器会报错。
程序中出现异常只有两种处理变法,要么在由try catch语句块包围,要么在方法上声明抛出异常。第一个程序showExce()方法中出现的异常采用方法上声明抛出异常,第二个func方法中出现的异常就是采用try catch捕获的。
回复 使用道具 举报
不能在保护区(try{})里抛出异常
回复 使用道具 举报
第一个程序 是把异常封装在了showExce()方法中了,通过 声明异常来表明可能会抛出异常,所以在第一个程序中的try语句中JVM认为的是showExce()只是可能会抛出异常,那么其下面的语句就是有可能会执行到的,所以可以编译通过。但在第二个程序中的try语句中是直接 throw  new Exception();的,那是JVM是认定这一定会抛出异常的,没有什么可能性,那么 它下面的执行语句就一定不会执行到的,所以编译是不通过 的。一个结论:在throw语句和return语句单独存在时,其下面不能出现执行语句,因为执行不到。
回复 使用道具 举报
class Demo
{        
        public static void func()
        {
                try
                {
                        throw  new Exception();
                      //  System.out.println("A");//这句话要注释掉,因为你在此时抛出了异常,try语句到此结束,写了没用。
                }
                catch(Exception e)
                {
                        System.out.println("B");
                }
        }
        public static void main(String[] args)
        {
                try
                {
                        func();
                }
                catch(Exception e)
                {
                        System.out.println("C");//你疑惑的可能是为什么没有打印这句话,其实你要知道catch是干什么的,他是捕获异常的,而在try语句中的func()方法虽然抛出了异常
                                                               //但是已经被func中的catch捕获所以打印了B,而对于对于外边的catch来说,try语句根本没有抛出异常,所以,没有打印这句话。
                }
                System.out.println("D");
        }
}

点评

第二个程序我觉的func里面的异常应该是抛给调用func者吧,也就是主函数,所以应该是主函数里面的catch捕获异常。所以应该是“C”打印而“B”不打印  发表于 2012-7-23 19:12

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 恭喜你,技术分达标,长时间的努力没有白费.

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马