Thinking in Java 第九章“异常与错误处理”要点总结

1.异常处理机制的好处

Thinking in Java 第九章“异常与错误处理”要点总结

2.Throwable中定义的printStackTrace()方法

Thinking in Java 第九章“异常与错误处理”要点总结

3.异常的默认输出方法再Throwable中

Thinking in Java 第九章“异常与错误处理”要点总结

getMessage()方法有点类似与toString()方法。

4.异常说明

把可能发生的异常throws在方法后面

Thinking in Java 第九章“异常与错误处理”要点总结

Thinking in Java 第九章“异常与错误处理”要点总结

5.作弊

Thinking in Java 第九章“异常与错误处理”要点总结

6.重新抛出异常

Thinking in Java 第九章“异常与错误处理”要点总结

fillInStackTrace()更新,可以让输出不是原来异常抛出点的地方,而是调用这个方法的地方。所以最后的输出会比printStackTrace短。

如果捕获异常后重新抛出另一个新的异常,那么效果和fillInStackTrace()是一样的

7.异常链

Thinking in Java 第九章“异常与错误处理”要点总结只有三种基本的异常类提供了带cause的构造器,其他的都必须调用initCause方法

Thinking in Java 第九章“异常与错误处理”要点总结Thinking in Java 第九章“异常与错误处理”要点总结

8.运行期异常(RuntimeException):不需要异常说明

这种异常是一种编译错误。

这种事不被检查的异常,是会被自动捕获的。

NullPointerException

9.用finally方法进行清理

无论程序有无异常,最后都会执行。

Thinking in Java 第九章“异常与错误处理”要点总结Thinking in Java 第九章“异常与错误处理”要点总结

10.异常丢失

Thinking in Java 第九章“异常与错误处理”要点总结

dispose()中的异常会覆盖f()中的异常。

11.异常的限制

。。。继承抽象类、实现接口的方法,所抛出的异常都应该是抽象类或接口里面抛出异常或其子类。

。。。子类的构造器必须抛出父类构造器的方法。

Thinking in Java 第九章“异常与错误处理”要点总结

12.构造器

构造器会把对象设置成安全的初始状态,但是如果涉及一些长时间的动作,比如读取文件,只有在文件被读取完之后用户调用清除方法后才会被清除。如果在构造器里发生了异常,这样这些动作就无法被清除;其中一种方法是在构造器的最后设置一个flag,如果在finally里面看到这个flag则不用清除,如果没看到就调用手动清除方法,但是这样会让两处代码耦合,不推荐这么做。

可以尝试抛多次:比如文件操作,如果操作出现问题就会抛出异常,此时捕获异常,处理异常时将文件关闭,在关闭这个过程外还应该再套上一个try-catch语句,这样如果关闭出现问题,也可以被系统发现并解决。

13.异常的匹配

按照书写的顺序,找到最近的匹配的异常。

比如:其中Sneeze是Annoyance 的子类

Thinking in Java 第九章“异常与错误处理”要点总结就会输出Caught Sneeze而

Thinking in Java 第九章“异常与错误处理”要点总结 这个还会报错,因为Sneeze的catch根本就会被屏蔽。

14.将异常包装成RuntimeException(把 被检查的异常 转化为 不被检查的异常)