当前位置: 首页 > 编程日记 > 正文

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与线性代数 -- 矩阵的左除

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…

《JavaScript应用程序设计》一一2.3 lambdas

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

Java异常体系结构

一、 异常的概念和Java异常体系结构 异常是程序运行过程中出现的错误。本文主要讲授的是Java语言的异常处理。Java语言的异常处理框架&#xff0c; 是Java语言健壮性的一个重要体现。 Java把异常当作对象来处理&#xff0c;并定义一个基类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 使用蓝牙设备

本节书摘来自异步社区《树莓派开发实战&#xff08;第2版&#xff09;》一书中的第1章&#xff0c;第1.15节&#xff0c;作者[英]Simon Monk&#xff08;蒙克&#xff09;&#xff0c;韩波 译&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.15 使用蓝牙…

C#语言与面向对象技术(5)

本图文主要掌握以下问题&#xff1a; 1. 什么是接口&#xff1f; 2. 接口的实现与类的继承有什么区别&#xff1f; 3. 接口与抽象类的相同点与不同点在哪里&#xff1f; 4. C#允许一个类实现多个接口&#xff0c;若多个接口中存在重名方法&#xff0c;如何处理&#xff1f;…

Java序列化的机制和原理

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

转 --有些事情需要注意

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

《Python数据分析与挖掘实战》一3.1 数据质量分析

本节书摘来自华章出版社《Python数据分析与挖掘实战》一书中的第3章&#xff0c;第3.1节&#xff0c;作者 张良均 王路 谭立云 苏剑林&#xff0c;更多章节内容可以访问云栖社区“华章计算机”公众号查看 3.1 数据质量分析 数据质量分析是数据挖掘中数据准备过程的重要一环&am…

Matlab与线性代数 -- 矩阵的右除

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…

Java中的值传递和引用传递

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

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)

本图文主要掌握以下问题&#xff1a; 1.什么是“类型安全”问题&#xff1f; 2.为什么要引入泛型&#xff1f; 3.什么是泛型&#xff1f; 4.泛型是如何实现的&#xff1f; 5.类与类之间存在哪些关系&#xff0c;如何表示&#xff1f;

Xposed: 勾住(Hook) Android应用程序对象的方法,实现AOP

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

Servlet防止页面被客户端缓存

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

二进制存储图片

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

《HTML5开发手册》——2.4 初学者“菜谱”:使用address元素提供通信信息

本节书摘来自异步社区《HTML5开发手册》一书中的第2章&#xff0c;第2.4节,作者&#xff1a; 【美】Chuck Hudson , 【英】Tom Leadbetter 更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.4 初学者“菜谱”&#xff1a;使用address元素提供通信信息 规范中将address…

Matlab与线性代数 -- 矩阵的转置

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…

做为程序员对sql进行的性能优化

今天面试&#xff0c;我简历上写了熟悉sql的性能优化&#xff0c;但是今天面试&#xff0c;一时想不起别的&#xff0c;就仅仅说出了一条&#xff0c;在这里再总结一些&#xff0c;完善自己的知识点。 我经常用的数据库是oracle&#xff0c;所以我的sql优化是程序员针对于orac…

asp.NET自定义服务器控件内部细节系列教程四

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

《C++游戏编程入门(第4版)》——1.12 习题

本节书摘来自异步社区出版社《C游戏编程入门&#xff08;第4版&#xff09;》一书中的第1章&#xff0c;第1.1节&#xff0c;作者&#xff1a;【美】Michael Dawson&#xff08;道森&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.12 习题 C…

Matlab与线性代数 -- 单位矩阵

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…

语句覆盖(Statement coverage)

一、语句覆盖(Statement coverage)“语句覆盖”是一个比较弱的测试标准&#xff0c;它的含义是&#xff1a;选择足够的测试用例&#xff0c;使得程序中每个语句至少都能被执行一次。 图6.4是一个被测试的程序&#xff0c;它的源程序…

RSS原理和实现

RSS是在互联网上被广泛采用的内容包装和投递协议。网络用户可以在客户端借助于支持RSS的新闻工具软件&#xff0c;在不打开网站内容页面的情况下&#xff0c;阅读支持RSS输出的网站内容。 1.RSS文件结构 示例&#xff1a; <?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矩阵

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…

java 冒泡排序和快速排序 实现

面试的时候经常会遇到面试官让你直接手写排序算法&#xff0c;下面是冒泡排序和快速排序的实现。冒泡排序基本流程就是&#xff0c;自下而上比较相邻的两个元素进行比较&#xff0c;让大的元素往下面沉&#xff0c;较小的往上冒。按照排序规则进行比较&#xff0c;如果是跟排序…

Matlab与线性代数 -- 零矩阵

打磨一项技能最需要的就是耐心&#xff0c;我们知道做一件事情不会一蹴而就&#xff0c;需要长时间的积累。关于Matlab的打磨会持续很长的时间&#xff0c;每天学习一个知识点&#xff0c;一年下来就不得了。要有耐心&#xff0c;要有耐心&#xff0c;跟着我们每天花5分钟的时间…