处理错误
异常分类
在Java中,异常对象都是派生于Throwable类的一个实例,Throwable又分解为:Error和Exception。Exception又可分解为两个分支:
- RuntimeException:由程序错误导致的异常:
- 错误的类型转换;
- 数组访问越界;
- 访问null指针;
- IOException:由I/O错误导致的异常:
- 试图在文件尾部后面读取数据;
- 试图打开一个不存在的文件;
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在;
Java将派生于Error类或RuntimeException类的所有异常称为非受查异常,所有其他异常称为受查异常。
声明受查异常
一个方法必须声明所有可能抛出的受查异常,而非受查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。如果在子类中覆盖了超类的一个方法,子类方法中声明的受查异常不能比超类方法中声明的异常更通用。如果超类方法没有抛出任何受查异常,子类也不能抛出任何受查异常。
创建异常类
创建异常类,只是定义一个派生于Exception的类,或者派生于Exception子类的类。
捕获异常
若某个异常发生的时候没有在任何地方进行捕获,那程序就会终止,并在控制台上打印出异常信息,其中包括异常的类型和堆栈的内容。要捕获一个异常,必须设置try/catch语句块。
- 在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,则:
- 程序将跳过try语句块的其余代码;
- 程序将执行catch子句中的处理器代码;
- 在try语句块中的代码没有抛出任何异常,则程序将跳过catch子句;
- 在方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,这个方法就会立刻退出。
finally子句
当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行,若方法获得了一些本地资源,并且只有这个方法自己知道,若这些资源在退出方法之前必须被回收,则就会产生资源回收问题。使用finally子句,可以保证不管是否异常被捕获,finally子句中的代码都会被执行。建议解耦合try/catch和try/finally语句:
分析堆栈轨迹元素
堆栈轨迹是一个方法调用过程的列表,包含了程序执行过程中方法调用的特定位置。