目录

  • 1. 简介
  • 2. 使用
  • 3. 语法
  • 4. 应用实例
  • 5. 断言的不足之处
  • 6. 对assert的思考


1. 简介

Java语言中的断言功能在项目中一般很少使用,我在第一次断言的时候是在查看springboot的源码的时候,当时武断的认为断言功能可能是一种比较高级的功能。哈哈哈,但是真正的了解之后,感觉assert的存在可能有些鸡肋,项目中也应该尽量避免使用。

2. 使用

在Java中,assert关键字是从JAVA SE 1.4引入的,为了避免和使用了Java1.4以前的版本开发的代码中的关键字assert冲突,Java程序在执行的时候默认是不开启断言的检查功能的(此时,程序中所有的断言功能都将被忽略)。如果要开启断言(assert)检查,则需要使用开关-enableassertions或者-ea来开启。

在IDEA开发工具中的配置如下图:

JAVA 断言测试报错 java中断言_开发语言


JAVA 断言测试报错 java中断言_Java_02

3. 语法

assert的关键字的语法很简单,有两种用法:

  1. assert <boolean表达式>
    如果<boolean表达式>为true,则程序继续执行。
    如果为false,则程序抛出AssertionError,并终止执行。
  2. assert <boolean表达式> : <错误信息表达式>
    如果<boolean表达式>为true,则程序继续执行。
    如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

4. 应用实例

接下来给出一个例子,通过例子来说明其用法:

public class AssertFoo{
	public static void main(String args[]){
		//断言1结果为true,则继续向下执行
		assert true;
		System.out.println("断言1没有问题,Go!");
		System.out.println("\n---------------\n");
		
		//断言2结果为false,程序终止。
		assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";
		System.out.println("断言2,没有问题,Go!");
	}
}

代码保存到C:\AssertFoo.java,然后按照下面的方式执行,查看控制台输出结果:

  1. 编译程序
C:\> javac AssertFoo.java
  1. 默认执行程序,没有开启-ea开关:
断言1没有问题,GO!

---------------

断言2,没有问题,Go!
  1. 开启-ea开关,执行程序:
断言1没有问题,GO!

---------------

Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
 
会在抛出异常的时候输出!
 
        at AssertFoo.main(AssertFoo.java:10)

5. 断言的不足之处

assert关键字的用法简单,但是用assert时往往还要考虑更多的问题。(参考网上的总结,有一下几点:)

  1. assert关键字需要在运行的时候显式开启才能生效,否则你的断言就没有任何的意义。而在主流的JavaIDE(Java集成开发环境)工具中默认都是没有开启-ea断言检查功能,这就意味着你如果使用IDE工具编码,调式运行的时候会有一定的麻烦。并且对于JavaWeb应用,程序代码都是部署在容器里面,你没有办法直接去控制程序的运行,如果一定要开启-ea的开关,则需要更改Web容器的运行配置参数。这对程序的移植和部署都带来很大的不便。
  2. 用assert代替if。assert的判断和if语句差不多。但是两者的作用有着本质的区别:assert关键字本意上是为了测试调试程序时使用的。但是如果不小心用assert来控制程序的业务流程,那么在测试或者调试结束后assert关键字就意味着修改了程序的正常逻辑。
  3. assert断言失败将面临程序的退出。这在生产环境下的应用时绝对不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。但是使用断言就很危险,一旦失败系统就挂了。(这点有待商榷) 分析:assert在使用过程中如果表达式的结果为false,则是会抛出AssertionError。AssertionError的源码如下,继承了Error。
  4. JAVA 断言测试报错 java中断言_intellij-idea_03

  5. 看到这里的时候,我本来也是认为一旦出现了AssertionError,整个程序都将会退出。
    但是事实确实狠狠的给了我一巴掌,AssertionError被全局的异常处理给捕获处理了,程序没有退出。
  6. JAVA 断言测试报错 java中断言_Java_04


  7. JAVA 断言测试报错 java中断言_Java_05

  8. 全局异常处理类中捕获的异常明明是Exception类型的异常,为什么Error类型的错误,也会在这里给处理了。恕我见识浅薄,各位看官有懂的可以提点一下。

6. 对assert的思考

assert既然是为了调试测试程序用,不在正式环境下用,那应该考虑使用更好的测试Junit来代替其使用。Junit相对assert关键字所提供的功能有过之而无不及。当然也可以完全通过IDE的debug模式来进行调式测试。从此看来,assert的前途一片渺茫。

因此,在项目中应该进行避免使用assert关键字。除非有一天Java默认支持开启-ea的开关,这个时候可以考虑。通过对比之后,我们可以发现,assert所带来的麻烦完全大于其所带来的好处。