1.异常处理机制的好处
2.Throwable中定义的printStackTrace()方法
3.异常的默认输出方法再Throwable中
getMessage()方法有点类似与toString()方法。
4.异常说明
把可能发生的异常throws在方法后面
5.作弊
6.重新抛出异常
fillInStackTrace()更新,可以让输出不是原来异常抛出点的地方,而是调用这个方法的地方。所以最后的输出会比printStackTrace短。
如果捕获异常后重新抛出另一个新的异常,那么效果和fillInStackTrace()是一样的
7.异常链
只有三种基本的异常类提供了带cause的构造器,其他的都必须调用initCause方法
8.运行期异常(RuntimeException):不需要异常说明
这种异常是一种编译错误。
这种事不被检查的异常,是会被自动捕获的。
NullPointerException
9.用finally方法进行清理
无论程序有无异常,最后都会执行。
10.异常丢失
dispose()中的异常会覆盖f()中的异常。
11.异常的限制
。。。继承抽象类、实现接口的方法,所抛出的异常都应该是抽象类或接口里面抛出异常或其子类。
。。。子类的构造器必须抛出父类构造器的方法。
12.构造器
构造器会把对象设置成安全的初始状态,但是如果涉及一些长时间的动作,比如读取文件,只有在文件被读取完之后用户调用清除方法后才会被清除。如果在构造器里发生了异常,这样这些动作就无法被清除;其中一种方法是在构造器的最后设置一个flag,如果在finally里面看到这个flag则不用清除,如果没看到就调用手动清除方法,但是这样会让两处代码耦合,不推荐这么做。
可以尝试抛多次:比如文件操作,如果操作出现问题就会抛出异常,此时捕获异常,处理异常时将文件关闭,在关闭这个过程外还应该再套上一个try-catch语句,这样如果关闭出现问题,也可以被系统发现并解决。
13.异常的匹配
按照书写的顺序,找到最近的匹配的异常。
比如:其中Sneeze是Annoyance 的子类
就会输出Caught Sneeze而
这个还会报错,因为Sneeze的catch根本就会被屏蔽。
14.将异常包装成RuntimeException(把 被检查的异常 转化为 不被检查的异常)