一、概述

在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,并输入<错误信息表达式>。

三、应用实例

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

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

2、默认执行程序,没有开启-ea开关: 
C:\>java AssertFoo 
断言1没有问题,Go!

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

断言2没有问题,Go!

3、开启-ea开关,执行程序: 
C:\>java -ea AssertFoo 
断言1没有问题,Go!

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

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

四、陷阱

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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

以上仅仅代表我个人观点,欢迎大家留言讨论。

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

下面是一些Assert的例子:

assert 0 < value;
assert 0 < value:"value="+value;
assert ref != null:"ref doesn''t equal null";
assert isBalanced();

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

AssertinError类是Error的直接子类,因此代表程序出现了严重的错误,这种异常通常是不需要程序员使用catch语句捕捉的。

使用assert的准则:assert语句的作用是保证程序内部的一致性,而不是用户与程序之间的一致性,所以不应用在保证命令行参数的正确性。可以用来保证传递给private方法参数的正确性。因为私有方法只是在类的内部被调用,因而是程序员可以控制的,我们可以预期它的状态是正确和一致的。公有方法则不适用。此外,assert语句可用于检查任何方法结束时状态的正确性,及在方法的开始检查相关的初始状态 等等。

assert语句并不构成程序正常运行逻辑的一部分,时刻记住在运行时它们可能不会被执行。

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

两类参数:
  参数 -esa和 -dsa:
  它们含义为开启(关闭)系统类的assertion功能。由于新版本的Java的系统类中,也使了 assertion语句,因此如果用户需要观察它们的运行情况,就需要打开系统类的assertion功能 ,我们可使用-esa参数打开,使用 -dsa参数关闭。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。

  参数 -ea和 -ea:
  它们含义为开启(关闭)用户类的assertion功能:通过这个参数,用户可以打开某些类或包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,表示打开这些类或包;如果包名称后面跟有三个点,代表这个包及其子包;如果只有三个点,代表无名包。关闭 assertion功能参数为-da,使用方法与-ea类似。
  -ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。
  下面表格表示了参数及其含义,并有例子说明如何使用。
  参数     例子                          说明
  -ea      java -ea                   打开所有用户类的assertion
  -da      java -da                   关闭所有用户类的assertion
  -ea:     java -ea:MyClass1   打开MyClass1的assertion
  -da:     java -da: MyClass1  关闭MyClass1的assertion
  -ea:     java -ea:pkg1          打开pkg1包的assertion
  -da:     java -da:pkg1          关闭pkg1包的assertion
  -ea:...  java -ea:...               打开缺省包(无名包)的assertion
  -da:...  java -da:...               关闭缺省包(无名包)的assertion
  -ea:...  java -ea:pkg1...       打开pkg1包和其子包的assertion
  -da:...  java -da:pkg1...       关闭pkg1包和其子包的assertion
  -esa    java -esa                 打开系统类的assertion
  -dsa    java -dsa                 关闭系统类的assertion

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

不要再public的方法里面检查参数是不是为null之类的操作,例如:

public int get(String s){
      assert s != null;
}

如果需要检查也最好通过 if s = null  抛出 NullPointerException来检查。

不要用assert来检查方法操作的返回值来判断方法操作的结果,例如:

assert list.removeAll();这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了,所以removeAll()操作就没有被执行,可以这样代替
boolean boo = list.removeAl();
assert boo;

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

另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API。下面简单说明一下几个API的作用。
ClassLoader类中的几个相关的API:
  setDefaultAssertionStatus:用于开启/关闭assertion功能
  setPackageAssertionStatus:用于开启/关闭某些包的assertion功能
  setClassAssertionStatus: 用于开启/关闭某些类的assertion功能
  clearAssertionStatus:用于关闭assertion功能

from: https://jiangzhengjun.iteye.com/blog/694886

Java断言(assert)相关推荐

  1. java断言assert初步使用:断言开启、断言使用

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说"断言不具有继承性". 断言只适 ...

  2. java 断言 assert 初步使用:断言开启、断言使用

    主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言只适用于复杂的调试过程. 断言一般用于程序执行结果的判断 ...

  3. java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...

  4. Java: 断言(assert)

    断言(assert)语句一半用于程序不准备通过捕获异常来处理的错误.例如:账号交易时,对于支出的金额为正数(收入+支出=纯收入)或者收入的金额为负数,程序必须立即停止执行,同时发现错误,当正式收益时, ...

  5. java断言assert的概念_断言(assert)简介

    java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...

  6. JAVA 断言——assert

    一.断言 在Java中常常用assert 关键字来限制参数传递(检验方法参数的有效性).非公有的方法通常应该使用断言( assertion )来检查它们的参数.不同于一般的有效性检查,断言如果失败,将 ...

  7. java断言assert

    1       断言 1.1      断言的作用 断言功能是用于软件的开发和测试的,主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退 ...

  8. java的断言_java断言assert初步使用:断言开启、断言使用

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说"断言不具有继承性". 断言只适 ...

  9. Java断言(assert)的介绍和使用

    Java断言(assert)的介绍和使用 在Java编程中,断言(assert)是一种有用的工具,用于在代码中进行条件检查和调试.通过使用断言,我们可以验证程序的逻辑和假设,确保程序在运行时达到预期的 ...

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

    理解和正确使用Java中的断言(assert) 一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如 ...

最新文章

  1. boost::spirit模块实现一个复数微生成器的测试程序
  2. 创建 linuxrc 文件
  3. 2018蓝桥杯省赛---java---B---4(测试次数)
  4. 1136 A Delayed Palindrome (20 分)
  5. ib课程计算机科学教材,热门课程:IB计算机科学的评估方式
  6. TDSQL 在微众银行的大规模实践之路
  7. StringUtil字符串小工具-功能扩展
  8. 医咖会免费SPSS教程学习笔记—斯皮尔曼相关系数(秩相关系数)
  9. 饥荒联机版服务器启动慢_饥荒联机版大型攻略——简介与目录
  10. win7电脑开启屏幕旋转功能吗 Win7系统屏幕的旋转功能如何使用
  11. 听课记录高中计算机,高中语文听课记录
  12. JS中各种width和height的区别
  13. 用flex做的3D坦克游戏
  14. A4纸张两面打印、每面打印2页的打印机设置
  15. Verilog TestBench 高级教程
  16. 人工神经网络在肺结核诊断中应用的研究进展
  17. 基于学习的平面抓取检测方法分类及讨论
  18. 书籍笔记-《SQL必会知识》
  19. php获取优酷剧集方法,优酷获取剧集例程源码
  20. 复分析阿尔福斯下载中文_复分析txt-复分析pdf-谁知我电子书

热门文章

  1. Kafka设计解析(七)- 流式计算的新贵 Kafka Stream
  2. 使用JSON Web Token设计单点登录系统--转
  3. Guide: Solr performance tuning--转载
  4. 当前工程读取配置文件示例
  5. Lesson 12.3 线性回归建模实验
  6. source insight使用说明[转]--后续发现好的再加
  7. 流行的就是最好的:Android开发者的职场规划
  8. 量产 php是什么,php文件怎么打开?下错的?
  9. 高并发编程-自定义简易的线程池(1),体会原理
  10. RocketMQ:消费端的消息消息队列负载均衡与重新发布机制源码解析