7.1 处理错误
- 用户期望在出现错误时,程序能够采用一些理智的行为
- 向用户通报错误
- 保存所有的工作结果
- 允许用户以妥善的形式退出程序
- 如果由于出现错误而使得某些操作没有完成,程序应该:
- 返回一种安全状态,并能够让用户执行一些其他的命令
- 允许用户保存所有操作的结果,并以妥善的方式终止程序
- 为了能够在程序中处理异常情况,必须研究程序中可能会出现的错误和问题,以及哪类问题需要关注
- 用户输入错误
- 设备错误
- 物理限制
- 代码错误
异常处理器(exception handler)
:- 在Java中,如果某个方法不能够采用正常的途径完成它的任务,就可以通过另一个路径退出方法,这种情况下,方法并不会返回值,而是
抛出(throw)
一个封装了错误信息的对象,同时会立即退出方法 - 调用该方法的代码将无法继续执行,取而代之的是,异常处理机制开始搜索能够处理这种情况的
异常处理器(exception handler)
7.1.1 异常分类
- 在Java中,如果某个方法不能够采用正常的途径完成它的任务,就可以通过另一个路径退出方法,这种情况下,方法并不会返回值,而是
-
Java中,异常对象都是派生于
Throwable类
的一个实例 - 如果Java中内置的异常类不能够满足需求,用户可以创建自己的异常类
Error类
层次描述了Java运行时系统的内部错误和资源耗尽错误.应用程序不应该抛出这种类型的对象- 在设计Java程序时需要关注
Exception
层次结构RuntimeException
:由程序错误导致的异常IOException
:程序本身没有异常,但由于I/O错误这类问题导致的异常
- 规则:
如果出现RuntimeException异常,那么就一定是你的问题
- Java将派生于Error类或者RuntimeException类的所有异常称为
非受查(unchecked)
异常,所有其他的异常成为受查(checked)
异常
7.1.2 声明受查异常
- 一个方法不仅需要告诉编译器将要返回什么值,
还要告诉编译器有可能发生什么错误
- 方法应该在其首部声明所有可能抛出的异常
- 应该派出异常的情况:
- 调用一个抛出受查异常的方法
- 程序运行过程中发现错误,并且利用
throw
抛出一个受查异常 - 程序出现错误
- Java虚拟机和运行时库出现的内部错误
- 任何一个抛出异常的方法都有可能是一个死亡陷阱,如果没有处理器捕获这个异常,当前执行的线程就会结束
- 对于那些可能被他人使用的Java方法,应该根据
异常规范(exception specification)
,在方法首部声明这个方法可能抛出的异常 - 如果一个方法有可能抛出多个受查异常类型,那么就必须在方法的首部列出所有的异常类.每个异常类之间用逗号隔开.
- 一个方法必须声明所有可能抛出的
受查异常
,而非受查异常要么不可控制,要么就应该避免发生,也不需要throw规范 - 如果在子类中覆盖了弗雷德一个方法,
子类方法声明中的受查异常不能比父类方法中声明的异常更通用
7.1.3 如何抛出异常
-
首先要决定应该抛出什么类型的异常
-
对于一个已经存在的异常类.将其抛出非常容易.在这种情况下:
- 找到一个合适的异常类
- 创建这个类的一个对象
- 将对象抛出
7.1.4 创建异常类
API|所在包|描述
:—:|:—:|:—:
Throwalbe()
|java.lang.Throwable
|构造一个Throwable对象,这个对象没有详细的描述信息
Throwable(String message)
|java.lang.Throwable
|构造一个新的Throwable对象,这个对象带有特定的详细信息
String getMessage
|java.lang.Throwable
|获得Throwable对象的详细描述信息