java中的断言Assert的使用

  • 一、背景
  • 二、如何判断是否开启了断言
  • 三、开启断言
  • 四、断言的使用
    • 方法一、assert <boolean表达式>
    • 方法二、assert <boolean表达式> : <错误信息表达式>
  • 五、Assert使用之陷阱
  • 六、对assert的思考

一、背景

1、java断言Assert是jdk1.4引入的。
2、jvm 断言默认是关闭的。
3、断言只适用于复杂的调试过程。
4、断言一般用于程序执行结果的判断,千万不要让断言处理业务流程。

二、如何判断是否开启了断言

public class AssertTest {public static void main(String[] args) {boolean isOpen = false;
assert isOpen=true; //如果开启了断言,会将isOpen的值改为true
System.out.println(isOpen);//打印是否开启了断言
}
}

执行上面代码,如果打印 true说明已经启用了断言,如果为 false 则没有启用断言。
如果没有启用断言,则按按照下面第三步的方法开启断言。

三、开启断言

选择菜单:Run —> Run Configurations…—> 选择 Arguments 选项卡
在 VM arguments 文本框中输入: -ea
注意:中间没有空格,如果输入 -da 表示禁止断言。
然后关闭该窗口,然后保存就开启了断言

四、断言的使用

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

方法一、assert <boolean表达式>

如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。

方法二、assert <boolean表达式> : <错误信息表达式>

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

五、Assert使用之陷阱

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. php7 断言,PHP 断言(assert) 详解

    PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...

  2. php 断言,PHP 断言(assert) 详解

    PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...

  3. 断言(assert)详解

    目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...

  4. 64位JVM的Java对象头详解

    关注"Java艺术"一起来充电吧! 我们编写一个Java类,编译后会生成.class文件,当类加载器将class文件加载到jvm时,会生成一个Klass类型的对象(c++),称为类 ...

  5. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  6. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  7. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

  8. java源码详解——String类

    java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...

  9. 【狂神说Java】多线程详解

    [狂神说Java]多线程详解 1.任务 生活中的例子.边吃饭.边玩手机 开车.打电话.挂点滴 上厕所.玩手机 现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时 ...

最新文章

  1. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)
  2. 都说产品要懂数据分析,到底要懂到什么程度?
  3. 马哥-51CTO-Linux培训-0910-程序包管理
  4. 设计模式笔记四:建造者模式
  5. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)
  6. bzoj 2244: [SDOI2011]拦截导弹
  7. Eclipse中Java编程时快速生成set和get方法
  8. ICMP协议Ping命令的应用
  9. 51Nod 1256 乘法逆元 Label:exgcd
  10. PTA-航空公司VIP客户查询
  11. http-server介绍及使用
  12. 时间序列分析的计量经济学方法 - Python中的序列性ARIMA
  13. 图片的 orientation 属性
  14. Flume avro client和hdfs sink 完成自定义目录文件收集
  15. php pandoc,Pandoc 标记语言转化工具
  16. 大数据时代改变生活九大应用领域
  17. declval 的说明
  18. 0521课的预习任务 + 课堂笔记
  19. 去哪儿网 ReactNative 跨小程序多端方案介绍
  20. mysql 统计表_MySQL统计表的设计

热门文章

  1. 【苹果传文件】【苹果手机文件传输】windows系统 iPhone手机文件传输 win系统苹果手机【苹果传电影】【苹果传图片】【一眼就会】
  2. 正点原子Linux驱动第三期
  3. Oracle FAST_START_MTTR_TARGET参数的理解
  4. 爬虫界新神器 | 一款比Selenium更高效的利器
  5. 超好看的PPT“组织架构图”模板
  6. html禁止搜索引擎转码,如何禁止百度、神马、搜狗等搜索引擎转码
  7. 计算机管理关机在哪,win7系统查看电脑关机和开机时间的详细教程
  8. 做古风类视频剪辑,不用担心素材侵权问题,在家每天稳定200多
  9. 利用echarts展示旅行足迹
  10. python virtualenv_Python 基础之 Virtualenv详解