黑马程序员技术交流社区

标题: 请帮忙解释下这个异常的执行顺序,异常学的有点模糊 [打印本页]

作者: 快乐Anne    时间: 2015-5-2 12:54
标题: 请帮忙解释下这个异常的执行顺序,异常学的有点模糊
package yichang;

public class Question {
        public static void func()throws Exception{//为什么不加throws Exception 就编译错误?
                try{
                        throw new Exception();
                }
                finally{
                        System.out.println("B");
                }
        }
        public static void main(String[] args) {
                try{
                        func();
                        System.out.println("A");
                }
                catch (Exception e) {
                        // TODO: handle exception
                        System.out.println("C");
                }
                System.out.println("D");
        }
}
作者: 蜗牛的异想世界    时间: 2015-6-1 11:24
你的fun()函数里try了但是怎么没catch呢??try{}catch(){}和throws是异常处理的两种方法不该一块在一个函数里用啊
作者: 少年闰土    时间: 2015-6-1 13:07
本帖最后由 少年闰土 于 2015-6-1 13:09 编辑

首先说执行结果吧:
B
C
D
原因:首先程序以main方法为入口,进入main函数后调用func方法,在func方法中你使用了try和finally语句块,在这里不管执行try语句块是否出现异常都会执行finally语句块,所以会打印B
然后继续分析main方法,main方法的try语句块中的func方法抛出了Exception异常所以A不会打印,并且会被catch 捕获所以直接跳到catch语句块中执行打印C
main执行完try-catch语句块后继续执行下一行程序,所以打印D,至此main执行完毕,程序结束。
另外,之所以在func方法声明中要用throws关键字声明此方法可能会抛出异常Exception,是因为在func函数中你throw了一个Exception异常,但是你没有用catch语句去捕获处理,这样就必须声明func方法会抛出异常,方便在调用func方法的方法中处理。

作者: 快乐Anne    时间: 2015-6-25 19:01
蜗牛的异想世界 发表于 2015-6-1 11:24
你的fun()函数里try了但是怎么没catch呢??try{}catch(){}和throws是异常处理的两种方法不该一块在一个函 ...

谢谢哦,虽然题目过去好久了,大家相互进步
作者: 快乐Anne    时间: 2015-6-25 19:36
少年闰土 发表于 2015-6-1 13:07
首先说执行结果吧:
B
C

思路很清晰,谢谢




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