JAVA异常(二)异常处理机制


回顾上一节简述了异常概念,以及异常的继承层次,和为什么引入异常。现在这一节主要是异常在实际中的运用!

一、异常处理机制
上一节讲了异常情形(是指阻止当前方法或作用域继续执行的问题)当出现异常情形怎么办? 通过当前问题环境,当前环境信息足够能知道该如何处理问题,或许当前环境信息不够,不知道如何处理。
当不知道如何处理的时候就需要使用throw进行异常的抛出!随之有几件事会发生。首先,同Java中其他对象的创建一样,将使用new在堆上创建异常对象。然后,当前的执行路径被终止,并且从当前环境中弹出对异常对象的引用。此时,异常处理机制接管程序,并开始寻找一个 恰当的地方(就是当抛出到信息足够的环境中,使用try进行捕获)来继续执行程序 (使用catch执行程序)。这个恰当的地方就是异常处理程序;
如果能够直接处理该问题那么这就是上面所说的恰当的地方,就可以直接进行 异常的捕获(try——catch)
二、异常的捕获处理
监控区域:一段可能产生异常的代码,对其进行监控并且后面跟着处理这些异常的代码;
那么对于一段可能产生异常的代码,可以分为两部分对其进行监控,当出现异常的时候,就执行跟在后面的异常处理程序;
监控:java关键字try{};使用{}将监控区域进行包裹住; 异常处理程序:java关键字catch;进行异常类型的匹配,然后执行相应的异常处理程序;
三、创建自定义异常
java中的异常不必拘泥于已有的异常类型;可以自定义异常,最好的是找意思相近的异常进行继承。但不过这或许有一些难度,所以直接继承Exception类也是可以的。 并且强调我们所捕获的异常全都归属于Exception类及其子类,并且非运行时异常是java强制要求进行捕获并处理的异常,而对于运行时异常就可以自己进行选择性的捕获了!
异常参数:标准的异常类都有两个构造器,一个默认构造器,一个是接受字符串作为参数,可以把相关信息放入异常对象的构造器;**通常错误信息可以保存在异常对象内部或者用异常类的名称来暗示**
四、异常说明
作用:能使调用者能确切知道写什么样的代码可以捕获所有潜在的异常。
其在java中一旦你使用了throw抛出异常就需要强制你在该函数后面使用throws进行异常说明;属于方法声明的一部分,紧跟在形式参数列表之后;
五、异常限制(主要是说在继承中进行方法重写的限制)
在进行继承之后,当覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常;但不过需要注意的是:异常限制对构造器不起作用等
六、捕获所有的异常
很多人对于处理异常总是不那么细致,比如可以只写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类Exception,这会捕捉到所有的异常。但不过通过会将其放置处理程序列表的末尾,而越前面就是越细致的错误,以防他抢在其他处理程序之前把异常进行捕获。因为 异常匹配机制会按照代码书写顺序找出“最近”的处理程序。而且查找的时候并不要求抛出的异常同处理程序声明的异常完全匹配派生类的对象也可以匹配其基类的处理程序;因为如果将例如Exception的异常放置前面就会造成基类将派生类的信息进行屏蔽掉!
七、使用finally进行清理
对于一些代码,会希望无论try块中的异常是否抛出,他们都能执行。这非常适用于系统资源的关闭回收,例如IO流或者打开的文件或网络连接。或者在return中使用finally可以从多个点进行返回,并且可以保证重要的资源得到释放!但不过有个生僻的考点:
try {
 // do something
 Sysem.exit(1);
} fnally{
 Sysem.out.println(“Print from fnally”);
}

例如这一段代码中的finally就不会执行,也算是个特例;
而且在java7的新特性里:释放资源的方式得到了简便try-with-resource结构进行资源释放

    try(  FileInputStream     input         = new FileInputStream("file.txt");
          BufferedInputStream bufferedInput = new BufferedInputStream(input)
    ) {
       。。。。。。
        }
    }

当input和bufferedInput离开try语句块是会自动进行关闭,这些资源将按照他们被创建顺序的逆序来关闭

八、注意事项
  1. 尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异
  2. 不要生吞(swallow)异常。
  3. try-catch代码段会产生额外的性能开销,或者换个角度说,它往往会影响JVM对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码;
  4. 利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值