断言通常只用在开发和测试阶段, 用来表示致命的, 不可恢复的错误, 尤其是用在单元测试的时候.
使用断言的原因:
除零前一般会添加一个除零判断:if(a<0) throw new IllegalArgumentException(“x<0”);
这段代码会一直保留在程序中,即使测试完毕后也不会自动的删除。
断言机制允许在测试期间向代码中插入一些检查语句,当代码发布时,这些插入的检测语句会被自动地移走。
[plain] view plaincopyprint?
1. assert 条件
2. assert 条件:表达式
断言将对条件进行判断, 如果条件是 false 则抛出 AssertionError 异常, 如果采用第二种形式, 表达式将被用来构造 AssertionError 异常.
默认情况下, 断言是禁用的, 这意味着程序不会运行包含断言的行, 可以在运行程序时用 -ea 或 -enableassertions 选项来启用断言, 我们也可以只启用或禁用某几个类或某几个包的断言, 具体形式如下
[plain] view plaincopyprint?
1. java -ea[:<packagename>...|:<classname>]
2. java -enableassertions[:<packagename>...|:<classname>]
3.
4. java -da[:<packagename>...|:<classname>]
5. java -disableassertions[:<packagename>...|:<classname>]
有些类不是由 ClassLoader 加载的, 而是由虚拟机加载的, 如果要启用或禁用这些类中的断言, 我们需要使用如下的形式, 不过通常我们不需要这么做.
[plain] view plaincopyprint?
1. java -esa 或 java -enablesystemassertions
2. java -dsa 或 -disablesystemassertions
在Eclipse中我们可以通过下面的方法来启用或禁用断言
[plain] view plaincopyprint?
1. 1. 全局设置
2. Window-->Preferences-->Java-->Installed JREs
3. 选择当前JDK,点击 Edit,在 Default VM Arguments 中输入 -ea 或 -enableassertions
4.
5. 2. 当前运行的程序
6. Run-->RunConfigurations,选择当前程序, 进入Arguments标签页,在VM arguments 中输入 -ea 或 -enableassertions
ClassLoader 类中提供了下来方法来动态启用或禁用断言
[plain] view plaincopyprint?
1. setDefaultAssertionStatus -- 用于启用或禁用断言
2. setPackageAssertionStatus -- 用于启用或禁用某些包中的断言
3. setClassAssertionStatus -- 用于启用或禁用某些类中的断言
4. clearAssertionStatus -- 用于关闭断言
断言和异常的区别
Ø 异常是你根本没办法预料在什么时候什么地方抛出来. 断言我更认为是保证后面程序正常运行的一种条件测试
Ø 断言仅仅是为了测试用的!异常用来做出错后的保护
断言的注意点:
Ø 断言失败是致命的,不可恢复的错误。(如除零错误前的if判断可以用断言代替,但当release版发布后,断言被自动忽略,所以,除零会发生致命错误)
Ø 断言检查只用于开发和测试阶段。
Ø 不应使用断言向程序其他部分通告发生了可恢复性的错误。(这句话的意思是不嗯能够把断言当异常来用,异常向程序其他部分通告发生了可恢复性的错误)
public class AssertionTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a=-1;
test(a);
}
private static void test(int a) {
// TODO Auto-generated method stub
assert a>=0 : a+1;
}
}
结果:
Exception in thread "main" java.lang.AssertionError: 0
at com.lmk.test.assertiontest.AssertionTest.test(AssertionTest.java:16)
at com.lmk.test.assertiontest.AssertionTest.main(AssertionTest.java:11)