Java陷阱之assert关键字

一、概述

在C和C++语言中都有assert关键,表示断言。

在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。

二、语法

在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都 将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。

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

1、assert <boolean表达式>

如果<boolean表达式>为true,则程序继续执行。

如果为false,则程序抛出AssertionError,并终止执行。

2、assert <boolean表达式> : <错误信息表达式>

如果<boolean表达式>为true,则程序继续执行。

如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

三、应用实例

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

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

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

                                                    1、编译程序:

                                                    C:\>javac AssertFoo.java

                                                    2、默认执行程序,没有开启-ea开关:

                                                      1. C:\>java AssertFoo
                                                          1. 断言1没有问题,Go
                                                                  1. -----------------
                                                                          1. 断言2没有问题,Go
                                                                          1.  

                                                                          3、开启-ea开关,执行程序:

                                                                            1. C:\>java -ea AssertFoo
                                                                                1. 断言1没有问题,Go
                                                                                        1. -----------------
                                                                                                1. Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
                                                                                                    1. 会在抛出异常的时候输出!
                                                                                                        1.         at AssertFoo.main(AssertFoo.java:10)
                                                                                                      1.  

                                                                                                      四、陷阱

                                                                                                      assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中。应避免使用。笔者经过研究,总结了以下原因:

                                                                                                      1、 assert关键字需要在运行时候显式开启才能生效,否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你如果使用IDE工具编码,调试运行时候会有一定的麻烦。并且,对于Java Web应用,程序代码都是部署在容器里面,你没法直接去控制程序的运行,如果一定要开启-ea的开关,则需要更改Web容器的运行配置参数。这对程序的移 植和部署都带来很大的不便。

                                                                                                      2、用assert代替if是陷阱之二。assert的判断和if语句差不多,但两者的作用有着本质的区别:assert关键字本意上是为测试 调试程序时使用的,但如果不小心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。

                                                                                                      3、assert断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。但是使用断言就很危险,一旦失败系统就挂了。

                                                                                                      五、对assert的思考

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

                                                                                                      因此,应当避免在Java中使用assert关键字,除非哪一天Java默认支持开启-ea的开关,这时候可以考虑。对比一下,assert能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

                                                                                                      原文地址:https://blog.csdn.net/m0_37768843/article/details/83088843

                                                                                                      Java中的断言assert的用法的更多相关文章

                                                                                                      1. Java中的断言assert

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

                                                                                                      2. Java中的断言 Assert

                                                                                                        今天正好遇到了,就记一下 一.作用: 用与编写单元测试 二.assert 关键字 assert 理论上和 if类似, 但是assert 仅仅用于测试, 不能用于业务 如果发现断言无效, 则可能时ide ...

                                                                                                      3. 理解和正确使用Java中的断言(assert)

                                                                                                        一.语法形式:    Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:1.assert conditio ...

                                                                                                      4. java 中的断言assert的使用

                                                                                                        一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,它是该版本在Java语言方面最大的革新. 从理论上来说,通过 assertion方式可以证明程 ...

                                                                                                      5. JAVA中字符串函数subString的用法小结

                                                                                                        本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

                                                                                                      6. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

                                                                                                        Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

                                                                                                      7. java中 this 的三种用法

                                                                                                        Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...

                                                                                                      8. Java中枚举的写法和用法

                                                                                                                在公司代码中,用了一大堆的枚举,看得我好懵逼.下面开始看看枚举怎么写和怎么用. 一.枚举的写法         关于枚举的写法,网上好多这方面的知识.这里直接贴一个我自己写的枚举类的代 ...

                                                                                                      9. Java中try,catch,finally的用法

                                                                                                        Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下. Java异常处理的组合方式: 1.try+catch  运行流程:运行到try ...

                                                                                                      随机推荐

                                                                                                      1. svn upgrade

                                                                                                        在我们把我们服务器上的svn 版本号升级以后,我们之前的代码再执行svn命令时,会提示需要执行svn upgrade命令把当前的代码由低版本的svn 上迁移到高版本的svn 上去. 直接执行svn u ...

                                                                                                      2. 【JZOJ4858】【GDOI2017模拟11.4】Walk

                                                                                                        题目描述 在比特镇一共有n 个街区,编号依次为1 到n,它们之间通过若干条单向道路连接. 比特镇的交通系统极具特色,除了m 条单向道路之外,每个街区还有一个编码vali,不同街区可能拥有相同的编码.如 ...

                                                                                                      3. RNN与 LSTM 网络

                                                                                                        循环神经网络(RNN) 人们的每次思考并不都是从零开始的.比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始.你的记忆是有 ...

                                                                                                      4. MUI - 打开页面默认弹出键盘及返回关闭键盘

                                                                                                        打开页面默认弹出键盘及返回关闭键盘 http://www.cnblogs.com/phillyx/ (function(keyboard) { var openSoftKeyboard = funct ...

                                                                                                      5. python系列之(1)BeautifulSoup的用法

                                                                                                        好久没更新博客了.打算写一个python的爬虫系列及数据分析.falg也不能随便立,以免打脸. python爬取内容,是过程,分析数据是结果,最终得出结论才是目的.python爬虫爬取了内容,一般都是 ...

                                                                                                      6. @RequestBody对象为空,异常Required request body is missing错误解决

                                                                                                        1.异常 org.springframework.http.converter.HttpMessageNotReadableException: Required request body is mi ...

                                                                                                      7. php代码在模板页的活用

                                                                                                      8. LeetCode86 Partition List

                                                                                                        题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

                                                                                                      9. Xcode编译报错:< Apple Mach-O Linker Warning > clang: error: no such file or directory: 'xxxx'

                                                                                                        Xcode编译报错概述: clang: error: no such file or directory: 'CoreGraphics' 一般原因是链接库内容导入丢失,这种的排查下target - B ...

                                                                                                      10. 01docker简单使用和配置(容器、镜像)

                                                                                                        一:容器中运行简单应用程序 1:hello  world 使用docker可以在容器中运行应用程序,使用docker run命令即可.比如下面的命令: $ docker run ubuntu /bin ...