文档章节

Java中的断言(assert)

乐在克里特
 乐在克里特
发布于 2017/02/23 13:47
字数 1217
阅读 6
收藏 0
点赞 0
评论 0

一、语法形式:
    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

© 著作权归作者所有

共有 人打赏支持
乐在克里特
粉丝 15
博文 265
码字总数 394729
作品 0
杭州
程序员
java编程新手入门学习的基础语法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/28 ⋅ 0

Gradle从入门到实战 - Groovy基础

前言 Android方向的第一期文章,会专注于Gradle系列,名字叫做『 Gradle从入门到实战』,计划有如下几个课程: Groovy基础 全面理解Gradle 如何创建Gradle插件 分析Android的build tools插件...

亭子happy ⋅ 06/13 ⋅ 0

JMeter学习-001-JMeter初识

Apache JMeter是Apache组织开发的基于Java的开源压力测试工具(个人发现也可用于接口测试)。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试...

拎壶冲冲冲 ⋅ 05/29 ⋅ 0

每个项目中,你必须知道的11个Java第三方类库。

Java第三方library ecosystem是一个很广阔的范畴。不久前有人撰文:每个项目中,你必须知道的11个Java第三方类库。 单元测试 1.DBUnit DBunit是一个基于junit扩展的数据库测试框架。它提供了...

thinkyoung ⋅ 2015/01/07 ⋅ 0

Java编程语言:精选,Java程序员的笔试题,你都知道答案吗?欢迎来补充!!!

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

启示录是真的 ⋅ 05/23 ⋅ 0

JAVA程序员面试题整理(较全面)

以下是在面试中可能会遇到的问题,话不多说,往下看 1、面向对象的特征有哪些方面? 2、访问修饰符public,private,protected,以及不写(默认)时的区别? 3、String 是最基本的数据类型吗? ...

编程大侠 ⋅ 04/09 ⋅ 0

Java面试题全集(上)+JavaSE基础

第一阶段:开发常用 JavaSE基础、Spring、Spring Boot、Spring Cloud、Hibernate、Mybatis、MySQL、Oracle、MariaDB(支持文档数据) 第二阶段:基础提升 JavaSE深入、JVM、数据结构+算法、H...

guod369 ⋅ 2017/12/28 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 今天 ⋅ 0

培训云计算学校,虚拟机基本结构讲解

我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。一个运行时的Java虚拟机实例的天职是:负责运行一个java程序。当启动一个Java程序时,一个虚拟机...

长沙千锋 ⋅ 05/17 ⋅ 0

sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer ⋅ 05/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启Swarm集群以及可视化管理

在搭建的两台coreos服务器上开启swarm集群 前置条件: docker均开启2375端口 同一个局域网内 主服务器上安装Portainer容器 安装Portainer容器执行: docker run -d -p 9000:9000 --restart=a...

ykbj ⋅ 11分钟前 ⋅ 0

单例设计模式

1、单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2、饿汉式单例类 在这个类被加载时,静态变量instance会被初始化,此时类的私有构造子会被调用 饿汉式是典型...

职业搬砖20年 ⋅ 16分钟前 ⋅ 0

前端基础(四):前端国际规范收集

字数:1142 阅读时间:5分钟 前言 由于前端技术的灵活性和杂乱性,导致网上的许多解决方案不够全面甚至是完全错误,容易起到误导作用。所以,我对搜索到的解决方案往往是存疑态度。那么,如何...

老司机带你撸代码 ⋅ 18分钟前 ⋅ 0

Failed to open/create Network-VirtualBox Host-Only

虚拟机版本 : Oracle Vm VirtualBox 5.2.12 报错时机:开网卡二,重启虚拟机报错 "Failed to open/create the internal network 'HostInterfaceNetworking-VirtualBox Host-Only Ethernet Ada......

p至尊宝 ⋅ 22分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

阿里云云栖社区 ⋅ 25分钟前 ⋅ 0

springMVC接收表单时 Bean对象有Double Int Char类型的处理

前台ajax提交表单price为double类型 后台controller就介绍不到 400错误 前台 实体类: public class ReleaseMapIconConfig{ private String id; private long maxValue; private long minVal......

废柴 ⋅ 27分钟前 ⋅ 0

ZOOKEEPER安装

工作需要在ubuntu上配置了一个zookeeper集群,有些问题记录下来。 1. zookeeper以来java,所以首先要安装java。但是ubuntu系统有自带的jdk,需要通过命令切换java版本: $ sudo update-alter...

恰东 ⋅ 30分钟前 ⋅ 0

linux 进程地址空间的一步步探究

我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。 那虚拟内存空间...

HelloRookie ⋅ 30分钟前 ⋅ 0

myatis #{}与${}区别及原理

https://blog.csdn.net/wo541075754/article/details/54292751

李道福 ⋅ 33分钟前 ⋅ 0

三分钟学会如何在函数计算中使用 puppeteer

摘要: 使用 puppeteer 结合函数计算,可以快速的构建弹性的服务完成各种功能,包括:生成网页截图或者 PDF、高级爬虫,可以爬取大量异步渲染内容的网页、模拟键盘输入、表单自动提交、登录网...

猫耳m ⋅ 35分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部