异常、断言
一、异常分类
异常对象都是派生于Throwable类的一个实例。
。、
Error类层次结构描述了java运行时系统的内部错误和资源耗尽错误。这种情况很少出现。
需要关注的是Exception层次结构。下面又划分了两个层次。由程序错误导致的异常属Runtime Exception;剩下的属于其他异常。
派生于RuntimeException的异常包含下面几种情况:
- 错误的类型转换。
- 数组访问越界。
- 访问null指针。
不是派生于RuntimeException的异常包括:
- 试图在文件尾部后面读取数据。
- 试图打开一个不存在的文件。
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。
Java语言规范将派生于Error类或Runtime Exception类的所有异常成为非受查异常,所有其他的异常称为受查异常
二、抛出异常
需要记住在遇到下面4种情况下应该抛出异常;
(1) 调用一个抛出受查异常的方法
(2) 程序运行过程中发现错误,并且利用throw语句抛出一个受查异常
(3) 程序出现错误
(4) Java虚拟机和运行时库出现的内部错误。
对于在程序中可能出现的受查异常,需要在方法的首部声明这个方法可能抛出的异常,如果一个方法有可能抛出多个受查异常类型,那么就必须在方法的首部列出所有的异常类。每个异常类之间用逗号隔开。不需要声明Java的内部错误,即从Error继承的错误也不声明从Runtime Exception继承的那些非受查异常
对于一个已经存在的异常类抛出异常的步骤:
(1) 找到一个合适的异常类。
(2) 创建这个类的一个对象。
(3) 将对象抛出
也可以自己创建一个异常类。
三、捕获异常
想要捕获异常,必须设置try/catch语句块。通常,应该捕获那些知道如何处理的异常,而将那些不知道怎么处理的异常继续传递(在方法的首部添加一个throws说明符)。
如果要捕获多个异常,可以编写多个catch语句,也可以在一个catch语句中捕获多个异常类型。
使用异常机制的技巧:
1、 异常处理不能代替简单的测试。
2、 不要过分的细化异常。
3、 利用异常层次结构。
4、 不要压制异常。
5、 在检测错误时,“苛刻”要比放任更好
6、 不要羞于传递异常。
四、断言
断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入语句将会被自动移走。
Java语言引入了关键字assert。这个关键字有两种形式;
- assert 条件;
- assert 条件:表达式;
如果检查的条件是false,则抛出一个AssertionError异常。在第二种形式中,表达式将被传入AssertionError的构造器,并转换成一个消息字符串。
在默认情况下,断言被禁用。可以在运行程序时用 –enableassertions或 –ea选项开启:java –enableassertions MyApp。也可以在某个类或整个包中使用断言:
例如 java –ea:MyClass –ea:com.mycompany.mylib…MyApp
也可以用选项 =disableassertions或 –da禁用某个特定类和包的断言。