1.什么是断言
断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。断言是为了方便调试程序,并不是发布程序的组成部分。理解这一点是很关键的。
默认情况下,JVM是关闭断言的。因此如果想使用断言调试程序,需要手动打开断言功能。在命令行模式下运行Java程序时可增加参数-enableassertions或者-ea打开断言。可通过-disableassertions或者-da关闭断言(默认情况,可有可无)。
2.断言的使用
语法形式有如下所示的两种形式: 1).assert condition; 这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为真,并且无任何行动,如果表达式为false,则断言失败,则会抛出一个AssertionError对象。这个AssertionError继承于Error对象,而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误。 2).assert condition:expr; 这里condition是和上面一样的,这个冒号后跟的是一个表达式,通常用于断言失败后的提示信息,说白了,它是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来。
举几个简单的例子:
第一种形式。
public class AssertDemo {
public static void main(String[] args) {
boolean isSafe = false;
assert isSafe;
System.out.println("断言通过!");
}
}
运行结果:
Exception in thread "main" java.lang.AssertionError
at assertdemo.AssertDemo.main(AssertDemo.java:8)
如果运行结果是:"断言通过!",说明没有开启断言,在IDEA中默认assert(断言)是关闭,开启方式如下:

简单来说:就是设置一下jvm的参数,参数是-enableassertions或者-ea(推荐)。
第二种形式。
public class AssertDemo {
public static void main(String[] args) {
boolean isSafe = false;
assert isSafe : "Not safe at all";
System.out.println("断言通过!");
}
}
运行结果:
Exception in thread "main" java.lang.AssertionError: Not safe at all
at assertdemo.AssertDemo.main(AssertDemo.java:8)
第二种形式和第一种的区别在于后者可以自定义错误信息。
注意:断言只是为了用来调试程序,切勿将断言写入业务逻辑中。比如考虑下面这个简单的例子:
public class AssertDemo {
public static void main(String[] args) {
assert (args.length>0);
System.out.println(args[1]);
}
}
该句assert (args.length >0)和if(args.length >0)意思相近,但是如果在发布程序的时候(一般都不会开启断言),所以该句会被忽视,因此会导致以下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at assertdemo.AssertDemo.main(AssertDemo.java:8)
对于项目中大量的业务逻辑的测试,推荐使用JUnit等专业测试框架。