1.Assertion
断言(Assertion)是一种程序调试方式
- 使用assert关键字
- 断言条件预期为true
- 如果断言失败,为false,抛出AssertionError
static double abs(double d){
return d >= 0 ? d : -d;
}
public static void main(String[] args){
double x = abs(-123.45);
assert x >= 0;
assert x >= 0: "x must >= 0";
System.out.println(x);
}
断言的特点:
- 断言失败时会抛出AssertionError,导致程序结束退出
- 不能用于可恢复的程序错误
- 只应该用于开发和测试阶段
什么是可恢复的程序错误?
void sort(int[] arr){
assert arr != null;
}
//不能用assert来判断变量是否为空,因为这个错误可以恢复
void sort(int[] arr){
if (x == null){
throw new IllegalArgumentException("array cannot be null");
}
}
对于可恢复的程序错误:
- 不应该使用断言
- 应该抛出异常并在上层捕获
2.启用断言
JVM默认关闭断言指令(即忽略所有的assert)
- 给Java虚拟机传递-ea参数启用断言
- 可以指定特定的类启用断言-ea:com.xiaoxiatianxi.sample.Main(类的全名)
- 可以指定特定的包启用断言-ea:com.xiaoxiatianxi...(包的全名)
选中class文件——单击右键——Run As ——Run Configurations....——Arguments
——在VM arguments中添加-ea:com.xiaoxiatianxi.sample.Main(类的全名)——Apply
——run
package com.xiaoxiatianxi.sample;
public class Main {
public static void main(String[] args){
double x = abs(-123.45);
assert x >= 0: "x must >= 0 but x =" + x;
System.out.println(x);
}
static double abs(double d){
return d < 0 ? d : -d;
}
}
对程序进行修改,将 return d < 0 ? d : -d; 改为return d > 0 ? d : -d; 则运行结果为:
3.总结
- 断言是一种调试方式,断言失败会抛出AssertionError
- 只能在开发和测试阶段启用断言
- 对可恢复的错误不能使用断言,而应该抛出异常
- 断言很少被使用,更好的方法是编写单元测试