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,并输入<错误信息表达式>。
三、应用实例
下面给出一个例子,通过例子说明其用法:
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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。
转自 http://tiantian0521.blog.163.com/blog/static/41720883201073025939130/
相关文章:

C#动态加载DLL
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 利用反射进行动态加载和调用.Assembly assAssembly.LoadFrom(DllPath); //利用dll的路径加载 加载dll后,需要使用dll中某类.Type typeass.GetType(“TypeName”);//利用类型的命名空…
Matlab与线性代数 -- 矩阵的左除
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

《JavaScript应用程序设计》一一2.3 lambdas
本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第2章,第2.3节,作者:Eric Elliott 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.3 lambdas lambdas是指那些作为数据使用的函数,它可以是函数的传入参数…

Java异常体系结构
一、 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架, 是Java语言健壮性的一个重要体现。 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable…

关于IssueVision命令模式中对象生命周期的困惑
在IssueVision的命令模式中有如下代码(\Patterns\Commander.cs)public static void Connect(ToolBarButton button, Command command){ToolBarButtonCommander unused new ToolBarButtonCommander(button, command);}按理说unused是内部变量,生命周期应该在Connect方法的作用范…

《树莓派开发实战(第2版)》——1.15 使用蓝牙设备
本节书摘来自异步社区《树莓派开发实战(第2版)》一书中的第1章,第1.15节,作者[英]Simon Monk(蒙克),韩波 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.15 使用蓝牙…
C#语言与面向对象技术(5)
本图文主要掌握以下问题: 1. 什么是接口? 2. 接口的实现与类的继承有什么区别? 3. 接口与抽象类的相同点与不同点在哪里? 4. C#允许一个类实现多个接口,若多个接口中存在重名方法,如何处理?…

Java序列化的机制和原理
有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节…

转 --有些事情需要注意
1:能不抽烟最好不抽,它或许可以帮助你吸引一些女生,但不抽绝不会招来厌烦,表现男子气概的途径有很多,没必要拿健康做赌注。2:给自己定目标,一年,两年,五年,也许你出生不如…

《Python数据分析与挖掘实战》一3.1 数据质量分析
本节书摘来自华章出版社《Python数据分析与挖掘实战》一书中的第3章,第3.1节,作者 张良均 王路 谭立云 苏剑林,更多章节内容可以访问云栖社区“华章计算机”公众号查看 3.1 数据质量分析 数据质量分析是数据挖掘中数据准备过程的重要一环&am…
Matlab与线性代数 -- 矩阵的右除
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

Java中的值传递和引用传递
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参…

ASP.NET网站建设基本常用代码
1.为按钮添加确认对话框Button.Attributes.Add("onclick","return confirm(确认?)");Button.Attributes.Add("onclick","if(confirm(确定?)){return true;}else{return false;}") 2.表格超连接列传递参数<asp:HyperLinkColumn Ta…
C#语言与面向对象技术(6)
本图文主要掌握以下问题: 1.什么是“类型安全”问题? 2.为什么要引入泛型? 3.什么是泛型? 4.泛型是如何实现的? 5.类与类之间存在哪些关系,如何表示?

Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP
Xposed Xposed能够勾住(Hook) Android应用程序对象的方法,实现AOP,一个简单的例子: public class WebViewHook implements IXposedHookLoadPackage {// handleLoadPackage 会在android加载每一个apk后执行public void handleLoadPackage(Load…

Servlet防止页面被客户端缓存
服务器端的HttpServlet可通过设置特定HTTP响应头来禁止客户端缓存网页,以下示范代码中的response变量引用HttpServletResponse对象: response.addHeader("Pragma","no-cache"); response.setHeader("Cache-Control","…

二进制存储图片
二进制存储图片 如果我们要将一个图片文件二进制于数据库中,那么我们就必须将图片文件转化为二进制数据内容,再将二进制数据存储至数据库中,这是图片存储(或是其它文件数据库存储)的基本原则。 至于要从数据库中读取图…

《HTML5开发手册》——2.4 初学者“菜谱”:使用address元素提供通信信息
本节书摘来自异步社区《HTML5开发手册》一书中的第2章,第2.4节,作者: 【美】Chuck Hudson , 【英】Tom Leadbetter 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.4 初学者“菜谱”:使用address元素提供通信信息 规范中将address…
Matlab与线性代数 -- 矩阵的转置
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…
做为程序员对sql进行的性能优化
今天面试,我简历上写了熟悉sql的性能优化,但是今天面试,一时想不起别的,就仅仅说出了一条,在这里再总结一些,完善自己的知识点。 我经常用的数据库是oracle,所以我的sql优化是程序员针对于orac…

asp.NET自定义服务器控件内部细节系列教程四
如大家要转载,请保留本人的版权:/* *Description:asp.NET自定义服务器控件内部细节系列教程*Auther:崇崇-天真的好蓝 *MSN:chongchong2008msn.com *Dates:2007-05-20*Copyright:ChongChong2008 YiChang HuBei China */四 服务器控件相关元数据Attribute 1.设计期A…

《C++游戏编程入门(第4版)》——1.12 习题
本节书摘来自异步社区出版社《C游戏编程入门(第4版)》一书中的第1章,第1.1节,作者:【美】Michael Dawson(道森),更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.12 习题 C…
Matlab与线性代数 -- 单位矩阵
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…
语句覆盖(Statement coverage)
一、语句覆盖(Statement coverage)“语句覆盖”是一个比较弱的测试标准,它的含义是:选择足够的测试用例,使得程序中每个语句至少都能被执行一次。 图6.4是一个被测试的程序,它的源程序…

RSS原理和实现
RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件,在不打开网站内容页面的情况下,阅读支持RSS输出的网站内容。 1.RSS文件结构 示例: <?xml version"1.0" encoding"gb23…

consul安装配置使用
2019独角兽企业重金招聘Python工程师标准>>> 环境 centos:7.3 docker:1.12.6 kernel:3.10.0-514.6.1.el7.x86_64 consul:0.8.1 server1:10.1.13.221 server2:10.1.13.222 consul的功能 服务发现 健康检查 支持多数据中心 key/value存储 consul的使用场景 docker实例…
Matlab与线性代数 -- 全1矩阵
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…

java 冒泡排序和快速排序 实现
面试的时候经常会遇到面试官让你直接手写排序算法,下面是冒泡排序和快速排序的实现。冒泡排序基本流程就是,自下而上比较相邻的两个元素进行比较,让大的元素往下面沉,较小的往上冒。按照排序规则进行比较,如果是跟排序…
Matlab与线性代数 -- 零矩阵
打磨一项技能最需要的就是耐心,我们知道做一件事情不会一蹴而就,需要长时间的积累。关于Matlab的打磨会持续很长的时间,每天学习一个知识点,一年下来就不得了。要有耐心,要有耐心,跟着我们每天花5分钟的时间…