java 断言 assert 详解:断言开启、断言使用
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 详解:断言开启、断言使用相关推荐
- php7 断言,PHP 断言(assert) 详解
PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...
- php 断言,PHP 断言(assert) 详解
PHP 中的断言常用于调试,检查一个表达式或语句是否为 FALSE.本文带你重新认识 PHP assert() 函数的神(Qi)通(Yin)广(Ji)大(Qiao). 本文基于 PHP Version ...
- 断言(assert)详解
目录 一.assert定义 二.用法总结与注意事项 四.以下是使用断言的几个原则: 一.assert定义 我一直以为 assert 仅仅是个报错函数,事实上,它居然是个宏,并且作用并非"报错 ...
- 64位JVM的Java对象头详解
关注"Java艺术"一起来充电吧! 我们编写一个Java类,编译后会生成.class文件,当类加载器将class文件加载到jvm时,会生成一个Klass类型的对象(c++),称为类 ...
- 4.6 W 字总结!Java 11—Java 17特性详解
作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...
- 5W字高质量java并发系列详解教程(上)-附PDF下载
文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...
- Java 线程池详解及实例代码
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...
- java源码详解——String类
java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...
- 【狂神说Java】多线程详解
[狂神说Java]多线程详解 1.任务 生活中的例子.边吃饭.边玩手机 开车.打电话.挂点滴 上厕所.玩手机 现实中太多这样同时做多件事情的例子了,看起来是多个任务都在做,其实本质上我们的大脑在同一时 ...
最新文章
- (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)
- 都说产品要懂数据分析,到底要懂到什么程度?
- 马哥-51CTO-Linux培训-0910-程序包管理
- 设计模式笔记四:建造者模式
- c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)
- bzoj 2244: [SDOI2011]拦截导弹
- Eclipse中Java编程时快速生成set和get方法
- ICMP协议Ping命令的应用
- 51Nod 1256 乘法逆元 Label:exgcd
- PTA-航空公司VIP客户查询
- http-server介绍及使用
- 时间序列分析的计量经济学方法 - Python中的序列性ARIMA
- 图片的 orientation 属性
- Flume avro client和hdfs sink 完成自定义目录文件收集
- php pandoc,Pandoc 标记语言转化工具
- 大数据时代改变生活九大应用领域
- declval 的说明
- 0521课的预习任务 + 课堂笔记
- 去哪儿网 ReactNative 跨小程序多端方案介绍
- mysql 统计表_MySQL统计表的设计
热门文章
- 【苹果传文件】【苹果手机文件传输】windows系统 iPhone手机文件传输 win系统苹果手机【苹果传电影】【苹果传图片】【一眼就会】
- 正点原子Linux驱动第三期
- Oracle FAST_START_MTTR_TARGET参数的理解
- 爬虫界新神器 | 一款比Selenium更高效的利器
- 超好看的PPT“组织架构图”模板
- html禁止搜索引擎转码,如何禁止百度、神马、搜狗等搜索引擎转码
- 计算机管理关机在哪,win7系统查看电脑关机和开机时间的详细教程
- 做古风类视频剪辑,不用担心素材侵权问题,在家每天稳定200多
- 利用echarts展示旅行足迹
- python virtualenv_Python 基础之 Virtualenv详解