异常分类
在Java中,异常对象都是派生于Throwable类的一个实例。在其下一层分为Error 和 Exception. Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。一般很少出现。 Exception类又分为两个分支:一个分支派生于RuntimeException ;另一个为其他异常。
派生于Exception的异常包含如下几种情况:
- 错误的类型转换。
- 数组访问越界。
- 访问空指针。
其他异常包括:
- 试图在文件尾部后面读取数据。
- 试图打开一个不存在的文件。
- 试图根据给定的字符串查找Class对象,而该字符串表示的类不存在。
派生于Error类与RuntimeException类的所有异常为检查异常,其他异常为已检查异常。
异常处理
抛出异常
方法应该在其首部声明所有可能抛出的异常。如果一个方法有可能抛出多个已检查异常,则必须在方法的首列出所有的异常类。每个异常类之间用逗号隔开。
抛出异常的情况:
- 调用一个抛出已检查异常的方法。
- 程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
- 程序出现错误。
- Java虚拟机和运行是库出现的内部错误。
抛出异常的步骤:
- 找到一个已有的异常类或基于已有异常类定义新的异常类。
- 创建该类的一个对象。
- 将对象抛出。
捕获异常
捕获异常要设置try/catch。利用finally子句可以关闭资源。实现了AutoCloseable接口的类实例在try块退出时,会自动调用close方法。
堆栈跟踪是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。
可以利用Throwable类的printStackTrace方法访问堆栈跟踪的文本描述信息。
另外一种是使用getStackTrace方法,得到StackTraceElement对象的一个数组,然后分析该数组。
静态的Thread.getAllStackTrace方法,可以产生所有线程的堆栈跟踪。