第一部分 Java的异常
一 异常处理
由于出现错误而使某些操作没有完成,程序应该:
1.返回到一种安全状态,并且能够让用户执行一些其他的命令
2.允许用户保存所有操作的结果,并以适当的方式终止程序
要做到这些并不容易,原因是检测错误条件的代码通常离1, 2的代码很远。
异常处理的任务就是将控制权从错误产生的地方转移到能够处理这种情况的错误处理器。
可能会出现的问题和错误:
1. 用户输入错误
2. 设备错误
3. 物理限制
4. 代码错误
异常分类:
所有的异常都是由Throwable继承来的。Throwable下一层分解为两支:Error和Exception。
Error类层次结构:描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这中类型的对象,出现这样的错误,除了通告用户,并尽力使应用程序安全的终止外,再也无能为力。
Exception层次结构分为两个分支:
RuntimeException:由程序错误导致的异常
其他异常:程序本身没有问题,但由于像I/O错误这类问题导致的异常
如果出现RuntimeException异常,那么就一定是你的问题。是一条相当有道理的规则。
Java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查异常,所有其他的异常称为已检查的异常。
声明已检查异常:一个方法不仅要告诉编译器将要返回什么值,还要告诉编译器有可能发生什么错误。
方法应该在其首部声明所有可能抛出的异常。
一个方法必须声明所有可能抛出的“已检查异常”,为未检查异常要么不可控(Error),要么就应该避免发生(RuntimeException)
二 捕获异常
应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常传递出去。将异常直接交给能够胜任的处理器进行处理要比压制
对它的处理更好。
不允许在子类的throws说明附中出现超过超类方法所列出的异常类范围。
即使try语句块中友return语句,也会执行finally语句,如果finally语句中也有return语句,那么将会覆盖try中的返回值。
三 使用异常机制的建议
1. 异常处理不能代替简单的测试,只有在异常情况下使用异常机制
2.不要过分的细化异常
3.利用异常层次结构
4.不要压制异常
5.在检测错误时,“苛刻”要比放任更好
6.传递异常要比捕获异常更好
总之,早抛出,晚捕获。
第二部分 使用断言来检测异常行为
断言机制允许在测试期间向代码中插入一些检查语句,当代吗发布时,这些插入的检测语句将会被自动的移走。
assert 条件;
assert 条件 :表达式;//表达式的唯一目的是产生一个消息字符串。
一 启用和禁用断言
1. 默认情况下,断言被禁止。程序使用-enableassertions 或者 -ea来启用它
java -enableassertions MyApp
在启用或者禁用断言时不必重新编译程序。启用或者禁用断言时类加载器的功能。当断言被禁时,类加载器就跳过断言代码,因此不会降低程序运行的速度。
2.也可以在某个类或者某个包中使用断言
java -ea:myclass -ea:com.mycom.lib... MyApp
3.也可以使用-disableassertions或-da禁用某个特定类和包的断言
java -ea:... -da:myclass MyApp
4.对于系统类来说,使用-enablesystemassertions/-esa开关启用断言
二 使用断言的建议
Java中处理系统错误的三种机制:
1. 抛出一个异常
2.日志
3.使用断言
什么时候使用断言?
1. 断言失败是致命的、不可恢复的错误
2.断言检查只用于开发和测试阶段,不应该使用断言向程序的其他部分通告发生了可恢复性的错误
断言是一种测试和调试阶段所使用的战术性工具;而日志记录是一种在程序的整个生命周期都可以使用的策略性工具。