异常处理总结

上传人:hs****ma 文档编号:479188588 上传时间:2023-02-17 格式:DOC 页数:10 大小:140KB
返回 下载 相关 举报
异常处理总结_第1页
第1页 / 共10页
异常处理总结_第2页
第2页 / 共10页
异常处理总结_第3页
第3页 / 共10页
异常处理总结_第4页
第4页 / 共10页
异常处理总结_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《异常处理总结》由会员分享,可在线阅读,更多相关《异常处理总结(10页珍藏版)》请在金锄头文库上搜索。

1、异常处理1、为什么要引入异常处理机制我们的程序在编译或运行时可能会出问题,当出现问题的时候程序就死掉了,这样的程序健壮性不好。因此在JAVA中我们引入了异常处理机制,既保证能及时 发现问题并加以纠正,又能保证程序不死掉。JAVA中保证程序健壮性的方式有三种:垃圾回收机制(保证不会发生内存泄露)弃用指针(保证不能直接对底层进行操作)异常处理机制(保证程序不会因发生异常而死掉)2、什么是异常处理机制2.1、异常的定义程序问题的分类:错误(Error):严重的错误,无法通过修改代码来处理。如JVM运行失败、线程池出错导致JVM无法正确运行。异常(Exceptio n):异常表示程序执行过程中出现的不

2、正常的现象,可以通 过修改代码来进行弥补。异常的分类:运行时异常(unchecked):运行时异常都是RuntimeException类及 其子类异常,如 NullPointerException 、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误 引起的,程序应该从逻辑角度尽可能避免这类异常的发生。编译时异常(checked):编译时异常是 RuntimeException以外的异 常,类型上都属于Exception类及其子类。从程序语法角度讲是必 须进行处理的异常,如果不处理,程序就不能编译通过。

3、如IOException、SQLException 等以及用户自定义的 Exception 异常,般情况下不自定义检查异常。异常处理的顺序:引发异常(检测异常情况并生成异常的过程叫引发异常)捕获异常(当异常被引发时,可被处理程序捕获)处理异常(上面的两个过程总称为处理异常)2.2、异常的捕获和处理机制Java异常处理涉及到五个关键字, 分别是:try、catch、fin ally 、throw、throws一个异常处理块的通常语法形式:Try/可能引发异常的语句Catch(Excepti on Typel ex)/获得此类异常信息并处理异常的代码Catch(Excepti on Type2 e

4、x)/获得此类异常信息并处理异常的代码(注意:Catch块的放置顺序,捕获子类异常放前面,捕获父类异常放后面)Fin ally/ 一般为释放资源的语句以上语法有三个代码块:try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。异常处理的代码执行顺序有两种不发生异常时:执行完Try块里的语句后跳过Catch块,执行Fin ally里面的语 句;若Try块中有return语句是,先执行Fin ally 里的语句, 再执行return ;若Try块中有Sistem.exit() 语句时将直接结束 程序,不执行Fin ally 里的语句。当发生异常时:ca

5、tch语句带一个Throwable类型的参数,表示可捕获异常类型。 当try中出现异常时,catch会捕获到发生的异常,并和自己的 异常类型匹配,若匹配,则执行 catch块中代码,并将catch 块参数指向所抛的异常对象。catch语句可以有多个,用来匹配多个中的一个异常,一旦匹配 上后,就不再尝试匹配别的catch块了。通过异常对象可以获取 异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的 原因等。fin ally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,而不管是否try语句块是否发生异常。并 且这个语句块总是在方法返回前执行。目的是给程序一个补救的

6、机会。这样做也体现Java语言的健壮性。Try Catch Fin ally使用时应注意的问题:try、catch、fin ally三个语句块均不能单独使用,三者可以组成try.catch.finally、try.catch、try.finally三种结构,catch语句可以有一个或多个,fin ally语句最多一个。try、catch、fin ally 三个代码块中变量的作用域为代码块内部,分别 独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定 义到这些块的外面。多个catch块时候,只会匹配其中一个异常类并执行catch块代码,而不会再执行别的catch块,并且匹配catch

7、语句的顺序是由上到下。throw、throws关键字的用法和对比:throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。 如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类 型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层 上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常 消息和堆栈信息。如果抛出的是 Error或RuntimeException,则该方法 的调用者可选择处理该异常。throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重 新抛出该异常。当方

8、法的调用者无力处理该异常的时候,应该继续抛出, 而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。一般来说,写了 throw 一定要写throws,而写了 throws不一定要写throw。throw、throws关键字的用法举例:public static void test() throws Excepti on/抛出一个检查异常throw new Exception(” 方法 test 中的 Exception);关于异常类:异常类是和其他类一样的类,java.la ng.Throwable类是所有异常类的根类java.lang.Throwable类有两个扩展类,分别是 E

9、rror类和Exception类JAVA中大多数异常类都使用Exception类ThrowableErrorEKceptionJava异常体系结构图Java的Java.lang中定义的运行时异常异常说明ArithmeticExceptio n算术错误,比如被0除Arrayl ndexOutOfBo un dsExceptio n数组下标出界ArrayStoreExcepti on数组元素赋值类型不兼容ClassCastExceptio n非法强制转换类型IllegalArgume ntExceptio n调用方法的参数非法IllegalMo ni torStateExceptio n非法监控操

10、作,如等待一个未锁定线程IllegalStateExcepti on环境或应用状态不正确IllegalTheadStateExcepti on请求操作与当前线程状态不兼容In dexOutBo un dsExcepti on某些类型索引越界NullPoi nterExceptio n非法使用空引用NumberFormatExcepti on字符串到数字格式非法转换SecurityExcepti on试图违反安全性Stri ngl ndexOurOfBo unds试图在字符串边界之外索引Un surpportedOperatio nExcepti on遇到不支持的操作Java的Java.lang

11、中定义的编译时异常异常说明ClassNotF oun dExcepti on找不到类Clo neNotSupportedExceptio n试图克隆不能实现Clo neable接口的对象IllegalAccessExcepti on对一个类的访问被拒绝In sta ntiatio nExceptio n试图创建一个抽象类或抽象接口的对象In terruptedExceptio n一个线程被另一个线程中断NoSuchFieldExceptio n请求的字段不存在NoSuchMethodExceptio n请求的方法不存在Throwable类中常用的核心方法方法描述Throwable fillI

12、nStackTrace()填充该执行堆栈跟踪String getLocalizedMessage()创建该可引发类的本地化描述String getMessage()返回该可引发对象的错误消息字符串Void prin tStackTrace将可引发类及其反向跟踪打印到标准 错误输出流Void printStackTrace(PrintStreams)将该可引发类及其反向跟踪打印到指 定的打印流Voidprin tStackTrace(Pri ntWriter将该可引发类及其反向跟踪打印到指s)定的打印机Stri ng toStri ng返回关于该可引发类的简短描述2.3、异常处理的一般原则能处理

13、就早处理,抛出不去还不能处理的就想法消化掉或者转换为RuntimeException处理。因为对于一个应用系统来说,抛出大量异常是有问 题的,应该从程序开发角度尽可能的控制异常发生的可能。对于检查异常,如果不能行之有效的处理,还不如转换为RuntimeException 抛出。这样也让上层的代码有选择的余地可处理也可不处理。对于一个应用系统来说,应该有自己的一套异常处理框架,这样当异常发生时,也能得到统一的处理风格,将优雅的异常信息反馈给用户。2.4、异常的转义与异常链所谓的异常转译就是将一种异常转换另一种新的异常,也许这种新的异常更 能准确表达程序发生异常。在Java中有个概念就是异常原因,

14、异常原因导致当前抛出异常的那个异 常对象,几乎所有带异常原因的异常构造方法都使用Throwable类型做参数,这也就为转义异常提供了直接的支持,因为任何形式的异常和错 误都是Throwable的子类。比如将SQLException转换为另外一个新的 异常DAOException,可以这么写:先自定义一个异常DAOException:public class DAOExceptio n exte nds Run timeExcepti on /( 一般来说都要写一下4个构造方法)public DAOExceptio n() super();public DAOExceptio n( Except

15、i on ex) super(Excepti on ex);public DAOExceptio n(Throwable th) super(Throwable th);public DAOExceptio n(Stri ng str) super(Stri ng str);比如有一个SQLException类型的异常对象e,要转换为DAOException, 可以这么写:DAOException daoEx = newDAOExceptio n( SQL 异常e);异常链顾名思义就是将异常发生的原因一个传一个串起来,即把底层的异常信息传给上层,这样逐层抛出。当程序捕获到了一个底层异常le,在处理部分选择了继续抛出一个更高 级别的新异常给此方法的调用者。 这样异常的原因就会逐层传递。这样, 位于高层的异

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号