Java之Exception总结——2017-11.19

一、Throwable类(摘自jdk)
1、Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。类似地,只有此类或其子类之一才可以是 catch 子句中的参数类型。
2、两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。
3、Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。此 cause 设施在 1.4 版本中首次出现。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。

5、导致 throwable cause 的一个理由是,抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的 throwable 向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层 API 与其实现细节关联起来,假定低层异常是经过检查的异常。抛出“经过包装的异常”(即包含 cause 的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性(尤其是,异常集合通过其方法抛出)。

6、导致 throwable cause 的另一个 cause 是,抛出它的方法必须符合通用接口,而通用接口不允许方法直接抛出 cause。例如,假定持久集合符合 Collection 接口,而其持久性在 java.io 的基础上实现。假定 add 方法的内部可以抛出 IOException。实现可以与其调用方交流 IOException 的详细消息,同时通过以一种合适的未检查的异常来包装 IOException,使其符合 Collection 接口。(持久集合的规范应该指示它能够抛出这种异常。)

7、Cause 可以通过两种方式与 throwable 关联起来:通过一个将 cause 看作参数的构造方法;或者通过 initCause(Throwable) 方法。对于那些希望将 cause 与其关联起来的新 throwable 类,应该提供带有 cause 的构造方法,并委托(可能间接)给一个带有 cause 的 Throwable 构造方法。例如:

 try {
     lowLevelOp();
 } catch (LowLevelException le) {
     throw new HighLevelException(le);  // Chaining-aware constructor
 }

因为 initCause 方法是公共的,它允许 cause 与任何 throwable 相关联,甚至包括“遗留 throwable”,它的实现提前将异常链机制的附件应用到 Throwable。例如:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw (HighLevelException)
new HighLevelException().initCause(le); // Legacy constructor
}
在版本 1.4 之前,许多 throwable 有自己的非标准异常链机制( ExceptionInInitializerError、 ClassNotFoundException、 UndeclaredThrowableException、 InvocationTargetException、 WriteAbortedException、 PrivilegedActionException、 PrinterIOException、 RemoteException 和 NamingException)。所有这些 throwable 都已经更新过,可以使用标准异常链机制,同时继续实现其“遗留”链机制,以保持兼容性。

此外,从版本 1.4 开始,许多通用的 Throwable 类(例如,Exception、RuntimeException、Error)都已经更新,具有带 cause 的构造方法。由于有 initCause 方法存在,这不是严格要求的,但它更方便,也更形象地委托给一个带有 cause 的构造方法。

根据惯例,Throwable 类及其子类有两个构造方法,一个不带参数,另一个带有 String 参数,此参数可用于生成详细消息。此外,这些子类很可能有与其相关联的 cause,因此也应有两个构造方法,一个带 Throwable (cause),一个带 String(详细消息)和 Throwable (cause)。

在版本 1.4 中还引入了 getStackTrace() 方法,它允许通过各种形式的 printStackTrace() 方法编程访问堆栈跟踪信息,这些信息以前只能以文本形式使用。此信息已经添加到该类的序列化表示形式,因此 getStackTrace 和 printStackTrace 将可在反序列化时获得的 throwable 上正确操作。

二、处理异常的方法。
1)捕获异常:try{} …catch(){}…fianlly
2)抛出异常:throws
3)throw可以加上自定义的Exception类
4)三者的使用频率1>2>3
三、注意事项
1)try..catch(){}…catch(){}变形
* 针对多个异常进行处理,第一个异常如果是大异常,那么后面可以不用再给了!
* 将大异常放在小异常的后面;
2)多个异常一块进行处理,只要try语句中的代码和catch语句中的代码所描述的异常类的信息一致,那么直接走catch里面的代码,try…catch语句结束。
*
3)、JDK1.7的新特性
try{
* //可能会出现问题的代码
* //….
* //…
* }catch(异常类名1 | 异常类名2 ….变量名){
* 处理异常…
* }
* 这个格式的注意事项:
* 1)针对多个异常类名之间是一种平级关系()
* 2)这种格式在实际开发中,虽然有多个异常,但是针对具体的异常给出具体的处理!
4)、throws
在方法声明上抛出异常,由于,编译时期异常,调用者必须要处理
实际开发中,尽量的不要在main()方法抛出异常,这样会影响线程的执行效率
5)throws和throw的区别?
throws:只是说明了异常可能出现的类型抛出。抛出后面跟的异常类名,可以跟多个异常类名,中间用逗号隔开,throws在方法声明上抛出,表示异常的一种可能性, 由调用者去处理, throws表示抛出异常的一宗可能性。
* throw:抛出
* 后面跟的异常对象(匿名对象),只能跟具体的一个异常对象
* throw在方法中的语句中抛出,表示异常的绝对性
* 有方法中某些语句处理
5)finally
finally经常用在数据库中或者IO流中,用来释放资源的
在fianlly中的代码一定会执行,所以一般流的Close()方法都会放在其中.
finally中的不执行只有一种情况:就是Jvm退出了———->System.exit(0) ;
6)final,finalize,和finally的区别?
* 区别:
* final:表示最终的,终态的意思
* 可以修饰类:类不能继承
* 可以修饰成员方法:成员方法被重写
* 可以修饰成员变量:此变量是一个常量 :自定义常量: public static final int ORANGLE = 100 ;
* finalize:它表示通过gc垃圾回收器回收不用的对象或者是变量,System.gc():实质,调用的是重写了Object类中的
* finalize()方法,表示回收没有跟多引用对象或者变量等等…
finally:不能单独使用,和try…catch…finally中一块使用,(异常,IO,数据库中中使用的),是用来释放资源
finally中的代码一定会执行,并且除非Java虚拟机Jvm退出了,才不会执行!
7)异常类的注意事项:
1)子类在重写父类中的方法的时候,如果父类中方法有抛出异常,那么子类重写的这个方法,抛出异常不能够比父类中该方法异常大,(要么是父类中该方法异常的子类)(最起码应该保存一致)(父亲坏了,儿子不能比父亲更坏)
2)子类继承父类,要重写父类中的方法的时候,如果本身父类中该方法没有异常,那么在子类中重写该方法的时候,不能抛出异常,只能捕获异常!

全部评论

相关推荐

巧克力1:双选会不如教室宣讲会
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务