Java陷阱之assert关键字

一、概述

  在C和C++语言中都有[assert](https://so.csdn.net/so/search?q=assert&spm=1001.2101.3001.7020)关键,表示断言。在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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

Java中的断言assert的用法相关推荐

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

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

  2. java assert false_深入剖析Java中的断言assert

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

  3. Java中的断言(assert)

    为什么80%的码农都做不了架构师?>>>    一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion), ...

  4. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

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

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

  6. Java中PreparedStatement和Statement的用法区别

    Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Sta ...

  7. python断言assert实例_Python断言assert的用法代码解析

    在开发一个程序时候,与其让它运行时崩溃,不如在它出现错误条件时就崩溃(返回错误).这时候断言assert 就显得非常有用. python assert断言是声明布尔值必须为真的判定,如果发生异常就说明 ...

  8. Java中static的含义和用法

    Java中static的含义和用法 static:静态的,用于修饰成员(成员变量,成员方法); 1.被static所修饰的变量或者方法会储存在数据共享区; 2.被static修饰后的成员变量只有一份! ...

  9. Java中栈和队列的用法 Stack And Queue

    Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...

  10. java drawstring字体大小,JAVA中,drawstring 方法的用法,格式是什么啊

    啦啦啦额68的回答 Java中Graphics类的drawString()方法: i)drawString(String str,int x,int y): String str是可以在屏幕上显示的字 ...

最新文章

  1. 怎样成为一个高手观后感
  2. thinkphp查询
  3. linux下部署svn服务器
  4. 软件生成目录没有图框_图纸目录和编号
  5. PTA浙大版python程序设计题目集--第1章-3 输出“Python语言简单易学” (10 分)
  6. 这样才能使本地Mysql服务允许被外部主机连接(两步)
  7. 第三次学JAVA再学不好就吃翔(part6)--基础语法之char数据类型
  8. javafx窗体程序_JavaFX真实世界应用程序:欧洲电视网广播联盟
  9. java tls 证书_在使用Java 8重新协商TLS_1.2期间,服务器证书更改受到限制
  10. python的速度_关于python的速度
  11. python调用库实现返回ping的时延_python在windows下实现ping操作并接收返回信息
  12. shell--字符串是否为空
  13. 用域代码任何带圈字符都能做出来
  14. Spring的AOP中的责任链模式
  15. 全链路压测那点事(一)
  16. 免费资源分享(六) Unity3D 雷达实时定位插件
  17. 网络安全产业快速递增网络安全体系以形成持有NISP和CISP证书可加分
  18. [图]Linux Kernel 5.2将大幅改善罗技无线设备的支持 可显示剩余电量
  19. 19.亿级流量电商详情页系统实战---总结
  20. 高校教师开计算机培训中心,计算中心

热门文章

  1. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之网格渲染器和过滤器Mesh renderers and filters...
  2. c语言 struct 的初始化
  3. Godaddy域名使用说明
  4. 世界是平的,这本书主要是写给美国人看的
  5. 读名老中医之路笔记(四)
  6. 从 global.console 看 Node.js 中的作用域
  7. 访问Internet 需要哪些步骤
  8. 关于网页内容加速黑科技的趣谈
  9. 11.深入分布式缓存:从原理到实践 --- Aerospike原理及广告业务应用
  10. 14.PHP核心技术与最佳实践 --- PHP 编码规范