Java异常的一些笔记
异常的相关知识学起来并非艰涩难懂,它属于那种可以使你的项目收益明显,立竿见影的特性之一。
- 正常执行过程中做什么事的代码与出了问题怎么办的代码相分离
- 所有标注异常类都有两个构造器,一个是默认构造器,另一个是接受字符串作为参数。
- 简单的把异常处理看成一种不同的返回机制
监控区域,try块
try{
} catch(Type1 id1){
} catch(Type2 id2){
}
//etc
与switch不同,每一块后面要跟break。
-
异常处理有两种模型:终止模型和恢复模型。一般用终止模型,恢复模型不能抛出,要借用while进行不断尝试try,这样导致耦合性高。
-
重新抛出异常,printStackTrace()方法显示的将是原来异常抛出点的调用栈信息,而并非重新抛出点的信息。要想更新这个 信息,可以调用 fillInStackTrace()方法,返回的是一个Throwable对象。
-
有可能在捕获异常之后抛出另一种异常,这么做的话类似于使用fillInStackTrace(),有关原来的异常信息发生点的信息会丢失,剩下新的异常点有关信息。异常链是捕获一个异常后抛出另一个异常,并且把原始异常的信息保存下来。
Throwable的子类构造器接受一个cause对象作为参数。 -
RuntimeException是一个特例,不受检查异常,不需要捕获直达main()方法,自动捕获,不必自己亲自动手的异常。
-
finally一般用于除垃圾回收机制外的如,打开的文件或者网络连接,或者是某个开关。提供代码健壮性。即使是没有捕获到异常也会处理,涉及break和continue的语句,finally也会执行。return语句中,也会执行finally语句。
-
当覆盖异常方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。基类覆盖方法的时候,可以不抛出异常。转型成基类则编译器会要求捕获基类方法的异常。
-
异常在编写构造器的时候可能出现异常,导致finally的清理也无法正常工作,这样可能导致打开的文件或者连接无法正常关闭,这时候需要特别注意,通用的清理惯用法是在构造器不抛出任何异常时也能运用,在创建需要清理的对象之后,立即进入一个try-finally语句快。
try{
A a = new A();
try {
B b = new B();
} finally{
b.dispose();
}
} finally {
a.dispose();
}
- 基类异常能够匹配派生类异常,基类异常如果放到catch子句前面,会把派生类异常全给吃掉。
重要原则:只有在你知道如何处理的情况下才捕获异常。