《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方法可以产生所有线程的堆栈轨迹

使用异常机制的技巧

  1. 异常处理不能代替简单的测试

判断一个栈是否为空再处理比直接pop再去try{}catch{}处理异常来的快

  1. 不过过分地细化异常
  2. 利用异常层级结构
  3. 不要压制异常
  4. 在检测错误时,苛刻比放任更好
  5. 不要羞于传递异常

使用断言

断言的两种形式:

assert object != null;
assert object != nul : object;

两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。
在第二种形式中,表达式将被传入AssertError的构造器,并转换成一个消息字符串
默认情况下,断言被禁用,可以在运行程序时用-ea选项启用,禁用为-da

java -ea MyApp
有些类不是由类加载器加载,而是直接由虚拟机加载
断言只应该用于在测试阶段确定程序内部的错误位置

原文地址:https://www.cnblogs.com/prelude1214/p/13812335.html