目录

  • 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开发工具中的配置如下图:

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。

    看到这里的时候,我本来也是认为一旦出现了AssertionError,整个程序都将会退出。
    但是事实确实狠狠的给了我一巴掌,AssertionError被全局的异常处理给捕获处理了,程序没有退出。


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

6. 对assert的思考

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

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

【Java中断言(assert)的理解】相关推荐

  1. java中的assert

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  2. Java中Map集合如何理解(四)——精简

    目录 引言 概念 Map集合实现类 HashMap LinkedHashMap TreeMap 默认排序 自定义排序方式 常用API 遍历Map集合 键找值 键值对 Lambda表达式 结束语 引言 ...

  3. java中class对象的理解 讲得相当不错 很接地气 引用下

    https://blog.csdn.net/mcryeasy/article/details/52344729 https://blog.csdn.net/dufufd/article/details ...

  4. Java中 synchronized 关键字的理解

    synchronized 关键字的理解 在Java中,synchronized 是一个重量级的控制并发的关键字. 这个关键字可以保证并发过程所必须的"原子性","可见性& ...

  5. Linux C 中断言assert()使用简介

    assert()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行.如果表达式不为0,则继续执行后面的语句,它的作用是终止程序 ...

  6. java中static关键字的理解(转载)

    static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列 ...

  7. JAVA 中转义符的理解

    生物信息中有时候会遇到JAVA写的程序,今天阅读源码的时候发现对于正则中的转义符不好理解,后来查资料后终于弄明白了,这里详细说明一下: 字符串的表示有三种方法:1.直接单字符,例如"A&qu ...

  8. java中对于框架的理解_接触Java项目一周后对一些基本框架的理解 | 学步园

    最近一周接触了一个Java EE的B/S项目,里面用到了SSH,部分持久层用的是ibatis,接触完后觉得有收获,于是把认识到的记录下来.同时欢迎高手拍砖. 现在终于知道所谓的三层框架(视图层,业务逻 ...

  9. 详细了解java中的null_深入理解java中的null“类型”

    本文研究的主要是java中的null"类型"的相关实例,具体介绍如下. 先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null"类 ...

最新文章

  1. 宗成庆:如何撰写毕业论文?
  2. python截取逗号_Python基础知识: 元组
  3. 昂靠的由来[本博作者爆料]
  4. 前端学习(2777):组件之间的通讯方式
  5. python实现的、带GUI界面电影票房数据可视化程序
  6. springboot+security框架整合
  7. python滑动手机屏幕_appium+python自动化24-滑动方法封装(swipe)
  8. HIve的概念,发展,历史,部署,入门,加载数据
  9. s5p4418安卓系统适配fpc8563芯片遇到的问题及解决
  10. 频段、信道带宽、EARFCN、频段和EARFCN之间的换算
  11. 共享充电宝APP小程序开发解决方案
  12. java的log计算_Java普通对数(log)计算方法
  13. 机房搬迁实施规划方案
  14. Microsoft Visual Studio 2019正式版离线安装包下载
  15. Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
  16. csol怎么设置屏蔽服务器信息,谁知道反恐精英OL的控制台怎么调? -反恐精英锤子宏设置...
  17. html颜色代码大全word,DIV+CSS网页设计之网页配色方案
  18. HCIA 交换机原理与ARP协议
  19. 解决国内网页无法加载reCaptcha的方法
  20. 图:邻接矩阵表示法创建无向图并深度优先搜索遍历

热门文章

  1. 字符串与时间的格式转换
  2. “直播+”时代,品牌服装电商之路
  3. RN TSX基于react-native-vector-icons和iconfont.cn 的生成自定义Icon组件的工具
  4. 百度音乐api+c语言,百度音乐API全接口
  5. ZOJ 4062 Plants vs. Zombies 2018 ICPC 青岛站 E Plants vs. Zombies
  6. MySQL忘记密码怎么修改密码
  7. redis展示 删除 详情
  8. 别光顾着吃瓜,今天来讲讲微博为何总宕机
  9. 广东省-IT公司红黑榜排名
  10. C++ array