黑马程序员技术交流社区

标题: 有关异常的两个程序题 [打印本页]

作者: 段应腾    时间: 2012-7-23 17:49
标题: 有关异常的两个程序题
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");
        }
}
这两个程序有什么不同、为什么执行结果会不一样、求解、尤其是第二个程序......

作者: rslheima    时间: 2012-7-23 18:03
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");
        }
}


作者: 孙飞    时间: 2012-7-23 18:05
第一个程序 是把异常封装在了showExce()方法中了,通过 声明异常来表明可能会抛出异常,所以在第一个程序中的try语句中JVM认为的是showExce()只是可能会抛出异常,那么其下面的语句就是有可能会执行到的,所以可以编译通过。但在第二个程序中的try语句中是直接 throw  new Exception();的,那是JVM是认定这一定会抛出异常的,没有什么可能性,那么 它下面的执行语句就一定不会执行到的,所以编译是不通过 的。一个结论:在throw语句和return语句单独存在时,其下面不能出现执行语句,因为执行不到。
作者: 牛少锋    时间: 2012-7-23 18:09
不能在保护区(try{})里抛出异常
作者: 唐见    时间: 2012-7-23 18:21
第一个程序showExce()方法抛出异常,被catch语句捕获,而finally语句是一定会执行的,所以第一个程序打印结果是BCD。
第二个程序:主方法先执行func方法。而func方法try块中虽然会抛出异常,但是会被catch块所捕获,方法内部自己将异常处理掉了,方法本身不会再抛出异常。所以主方法中执行的func()方法不会再抛出异常。打印结果为BD。还有func()方法中的 System.out.println("A");语句不可能被执行,因为出现异常后的代码不会被执行,此时编译器会报错。
程序中出现异常只有两种处理变法,要么在由try catch语句块包围,要么在方法上声明抛出异常。第一个程序showExce()方法中出现的异常采用方法上声明抛出异常,第二个func方法中出现的异常就是采用try catch捕获的。

作者: 京鱼龙    时间: 2012-7-23 18:43
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, 下载次数: 113)

ttttt.JPG

作者: rslheima    时间: 2012-7-23 19:20
rslheima 发表于 2012-7-23 18:03
class Demo
{        
        public static void func()

呵呵,你运行过吗?我的结果是我说的那样。
作者: 李菁    时间: 2012-7-23 19:57
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
作者: 肖琦    时间: 2012-7-23 23:04
主要说第2个Demo,首先注释掉func中的System.out.println("A");,因为编译通不过。
func中你制造的异常已经被捕获,所以对func的调用者来说,func是正常返回的,没有发生异常,当然不会进入main方法中catch块.
希望对你有帮助.....





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2