Java中的断言(assert)
为什么80%的码农都做不了架构师?>>>
一、语法形式:
Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的
语法形式有如下所示的两种形式:
1、assert condition;
这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为真,并且无任何行动
如果表达式为false,则断言失败,则会抛出一个AssertionError对象。这个AssertionError继承于Error对象,
而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误。
2、asser condition:expr;
这里condition是和上面一样的,这个冒号后跟的是一个表达式,通常用于断言失败后的提示信息,说白了,它是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来。
二、使用示例:
下面是一个使用assert的例子:
public class TestAssert{
public static void main(String[] args){
String name = null;
assert(name!=null):"变量name为空null";
System.out.println(name);
}
}
上面程序中,当变量name为null时,将会抛出一个AssertionError,并输出错误信息。
要想让上面的程序中的断言有效并且正确编译,在编译程序时,必须使用-source 1.4选项。如:
javac -source 1.4 TestAssert.java
在Eclipse(3.0M9)开发环境中,必须在window->preferences 中,左边选中"Java->Compiler",右边选择
“Compliance and ClassFiles”页面下的将"Compiler Compliance Level"选择为1.4;同时,将
"Use Default Compiler Settings"前的勾去掉。并将下面的
"Generated .class file compatibility"和"Sourcecompatibility"均选择为1.4,才能正确编译。
{
eclipce中实现开启Assert:
选择菜单:Run ---> Run... ---> 选择 Arguments 选项卡
在 VM arguments 文本框中输入: -ea 注意中间没有空格,如果输入 -da 表示禁止断言。
(如果找不到以上路径,请依次开启断言:Windows -> Preferences ->Java ->Installed JREs ->点击正使用的JDK ->Edit ->Default VM Arguments文本框中输入:-ea)
不过记得要改回来。
如果禁止断言,则按第二步操作中,删除 -ea 或者将 -ea 改为 -da 即可。
}
同时,要想让断言起效用,即让断言语句在运行时确实检查,在运行含有assert的程序时,必须指定-ea选项
如:为了能够让上面的程序运行,我们执行下面代码:
java -ea TestAssert
在在Eclipse(3.0M9)开发环境中,运行时,我们必须配置运行时的选项"Run",在Arguments页面中的
"VM Arguments" 中填入-ea选项。才能让断言在运行时起作用。
三、注意事项:
理解断言最重要的一点是必须不依赖它们完成任何程序实际所需的行为。理由是正常发布的代码都是断言无效的,即正常发布的代码中断言语句都不不执行的(或不起作用的),如果一不小心,我们可以错误地使用断言,如:
public class TestPerson{
private String TestPerson(String name){
this.name = name;
}
public void setName(String nameStr){
this.name = nameStr;
}
public String getName(){
return this.name;
}
public static void main(String[] args){
TestPerson personObj = newTestPerson("Abner Chai");
String personName = null;
assert(personName=personObj.getName())!=null;
System.out.println(personName.length());
}
}
这个程序中,对personName的赋值被转移到assert6语句中,尽管断言有效时它可以很好地运行(即使用-ea运行
时可以有效地运行)但如果断言失效,则它会运行时报空指针错误。因为断言无效时,
personName=personObj.getName()一句永远不会执行!
断言对Java来说是一个好的条件,因为它们使开发过程中错误类型检查流线化,例如,在没有assert之前,
上面的程序要想确认personName 不空,则必须:
if(personName!=null){
System.out.println(personName.length());
}
才行。有了assert后,使用assert,只需一行代码,并且不必从发布的代码中删除assert语句。
于是,上面的那个程序,经改正后,我们可以这么样来正确的使用assert,如下:
public class TestPerson{
private String TestPerson(String name){
this.name = name;
}
public void setName(String nameStr){
this.name = nameStr;
}
public String getName(){
return this.name;
}
public static void main(String[] args){
TestPerson personObj = newTestPerson("Abner Chai");
String personName = null;
personName=personObj.getName();
assert personName!=null;
System.out.println(personName.length());
}
}
四、其它选项:
当执行代码时,使用-ea选项使断言有效,也可以使用-da选项使断言无效(默认为无效)
同样,也可以通过在-ea或-da后面指定包名来使一个包的断言有效或无效。例如,要使一个com.test包中的断言
无效,可以使用:
-da:com.test
要使一个包中的所有子包中的断言能够有效或无效,在包名后加上三个点。例如:
-ea:com.test...
即可使com.test包及其子包中的断言无效。
相关文章链接:http://blog.csdn.net/AbnerChai/archive/2004/08/28/87379.aspx
http://blog.csdn.net/leichelle/article/details/7951321
关于是否开启断言了,请看这:
http://blog.sina.com.cn/s/blog_95feae0d0101hhcg.html
转载于:https://my.oschina.net/itommy/blog/844573
Java中的断言(assert)相关推荐
- 理解和正确使用Java中的断言(assert)
理解和正确使用Java中的断言(assert) 一.语法形式: Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如 ...
- java assert false_深入剖析Java中的断言assert
Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...
- java 断言assert_Java中的断言 Assert
今天正好遇到了,就记一下 一.作用: 仅用与编写单元测试, 一般不用于生产环境 assert 理论上和 if 类似, 但是assert 仅仅用于测试, 不能用于业务 from jdk 1.4 二.as ...
- Java 中的 断言 (assert)—— 初识 简单的使用和理解~只要这一篇就够了
首先老样子,三个方面来理解 断言是个啥(尝试初步<理解>) 如何使用(到底咋子个用,啥时候用) 个人的思考理解和总结(说话不负责时间) 断言与if的区别 断言和异常的区别 总结 新年快乐! ...
- C/C++中的断言(assert与static_assert)
你也可以通过我的独立博客 -- www.huliujia.com 获取本篇文章 assert简介 assert被C/C++用来判断某些条件是否成立,比如判断指针类型的大小sizeof(void*)是否 ...
- python断言assertequal_python中那个断言assert的优化
Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...
- java 断言 assert 详解:断言开启、断言使用
java中的断言Assert的使用 一.背景 二.如何判断是否开启了断言 三.开启断言 四.断言的使用 方法一.assert <boolean表达式> 方法二.assert <boo ...
- java断言assert的概念_断言(assert)简介
java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...
- java assert函数_assert函数-论java中assert函数和Python、PHP、C语言assert函数
assert函数广泛在java.Python.PHP.C语言中存在,都有统一的意义,用业界语言称之为"断言".最初的出发点都是为了方便调试而设计的,但是最近越来越多的开发者不分测试 ...
最新文章
- Android 自定义View —— Paint
- [asp.net core]SignalR一个例子
- 《Apache Common CLI官方文档
- PyCharm如何集成PyQt
- JavaScript基础学习之运算符(三)
- 自动计算高度的方法 iOS, height为0, 可以自动计算weith,
- java全局异常处理_详解Spring全局异常处理的三种方式
- 输入234输出432的c语言程序,C程序设计第1-4章习题集
- FPGA的一些细节(持续更新)
- 2.抽象工厂(Abstract Factory)
- 【Activity】Activity的启动模式:SingleTask
- 项目经理是有责无权的“领导” 要会借力
- mkv文件用什么软件打开_什么是MKV文件,以及如何播放它们?
- 股权比例的几个临界点
- Excel根据快递单号自动识别快递公司
- 矢量图和位图都是计算机记录_ _的方式,在计算机上如何区别矢量图和位图?
- 【微机汇编语言学习笔记(四)】十进制数的ASCII转换为BCD码
- 中国微单相机市场深度研究分析报告
- Blog:全民媒体时代的来临?
- iPhone 5s 如何进入 DFU 模式,macOS 无法进入 DFU 模式
热门文章
- Python基础总结(5)
- 图像 主轴 相关知识
- CNN阴影去除--DeshadowNet: A Multi-context Embedding Deep Network for Shadow Removal
- 【puthon】把大量csv文件写入h5文件制作数据集
- go string 转 uint64_小改动,大提升:最近 Go 标准库的一次优化
- 手机app软件测试教程,手机app制作软件测试app的技巧和方式(上)
- android 服务器异步回调,android – 如何从异步任务返回结果
- 升级mysql服务器二进制备份_MySQL二进制日志备份和恢复详解
- c 读取mysql中表中数据_c#读取MySQL数据表中的内容
- hmm 求隐藏序列_统计学习方法--HMM回顾