《Java核心技术 卷I》读书笔记六
章节内容
- 处理错误
- 捕获异常
- 使用异常机制的技巧
- 使用断言
- 记录日志
- 调试技巧
处理错误
异常分类
在java中,异常对象都是派生于Throwable类的一个实例。
所有的异常分为Error和Exception
Error类层级结构描述了Java运行时系统的内部错误和资源耗尽错误
Exception又被分成RuntimeException和IOException
“如果出现RuntimeException异常,那么就一定是你的问题”这是一条有道理的准则
Java规范将派生于Error类或RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常。
捕获异常
如果某个异常发生的时候没有在任何地方捕获,程序就回终止,并在控制台打印出异常信息。要想捕获一个异常,必须设置try/catch语句块
如果调用了一个抛出受查异常的方法,就必须对它进行处理或者继续传递
不允许在子类的throws说明符中出现超过超类方法说列出的异常范围
不管是否有异常被捕获,finally子句中的代码都被执行
资源的异常处理一般比较难处理,如果资源属于一个实现了AutoCloseable接口的类,Java7为这种提供了很快捷方便的异常处理机制:
try(Resource r = ...) {
}
try块退出后,自动调用r.close()方法,该方法属于AutoCloseable接口
可以调用Throwable类的printStackTrack方法访问堆栈轨迹的文本描述信息
另一种更灵活的方式是通过处理getStackTrace方法得到的StackTraceElement对象数组来分析异常
静态的Thread.getAllStackTrace方法可以产生所有线程的堆栈轨迹
使用异常机制的技巧
- 异常处理不能代替简单的测试
判断一个栈是否为空再处理比直接pop再去try{}catch{}处理异常来的快
- 不过过分地细化异常
- 利用异常层级结构
- 不要压制异常
- 在检测错误时,苛刻比放任更好
- 不要羞于传递异常
使用断言
断言的两种形式:
assert object != null;
assert object != nul : object;
两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。
在第二种形式中,表达式将被传入AssertError的构造器,并转换成一个消息字符串
默认情况下,断言被禁用,可以在运行程序时用-ea选项启用,禁用为-da
java -ea MyApp
有些类不是由类加载器加载,而是直接由虚拟机加载
断言只应该用于在测试阶段确定程序内部的错误位置