理解和正确使用Java中的断言(assert)
一、语法形式:
    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 = "abner chai";
         //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"和"Source compatibility"均选择为1.4,才能正确编译。

同时,要想让断言起效用,即让断言语句在运行时确实检查,在运行含有assert的程序时,必须指定-ea选项
如:为了能够让上面的程序运行,我们执行下面代码:

java -ea TestAssert

在在Eclipse(3.0M9)开发环境中,运行时,我们必须配置运行时的选项"Run",在Arguments页面中的
"VM Arguments" 中填入-ea选项。才能让断言在运行时起作用。

三、注意事项:
    理解断言最重要的一点是必须不依赖它们完成任何程序实际所需的行为。理由是正常发布的代码都是断言无效的,即正常发布的代码中断言语句都不不执行的(或不起作用的),如果一不小心,我们可以错误地使用断言,如:

public class TestPerson{
    private String name = null;
    public 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 = new TestPerson("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 name = null;
    public 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 = new TestPerson("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包及其子包中的断言无效。

理解和正确使用Java中的断言(assert)相关推荐

  1. Java中的断言(assert)

    为什么80%的码农都做不了架构师?>>>    一.语法形式:     Java2在1.4中新增了一个关键字:assert.在程序开发过程中使用它创建一个断言(assertion), ...

  2. java assert false_深入剖析Java中的断言assert

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  3. Java 中的 断言 (assert)—— 初识 简单的使用和理解~只要这一篇就够了

    首先老样子,三个方面来理解 断言是个啥(尝试初步<理解>) 如何使用(到底咋子个用,啥时候用) 个人的思考理解和总结(说话不负责时间) 断言与if的区别 断言和异常的区别 总结 新年快乐! ...

  4. java关于重写正确,在Java中,以下关于方法重载和方法重写描述正确的是( )

    在Java中,以下关于方法重载和方法重写描述正确的是( ) 答:方法重写的返回值类型必须相同或相容.(或是其子类) 对乙酰氨基酚临床用途是抗炎抗风湿作用 答:错 观念艺术是哲学的反思,传统的理论可以对 ...

  5. java 断言assert_Java中的断言 Assert

    今天正好遇到了,就记一下 一.作用: 仅用与编写单元测试, 一般不用于生产环境 assert 理论上和 if 类似, 但是assert 仅仅用于测试, 不能用于业务 from jdk 1.4 二.as ...

  6. 如何正确实现 Java 中的 HashCode

    相等 和 Hash Code 从一般角度来看,Equality 是不错的,但是 hash code 更则具技巧性.如果我们在 hash code上多下点功夫,我们就能了解到 hash code 就是用 ...

  7. C/C++中的断言(assert与static_assert)

    你也可以通过我的独立博客 -- www.huliujia.com 获取本篇文章 assert简介 assert被C/C++用来判断某些条件是否成立,比如判断指针类型的大小sizeof(void*)是否 ...

  8. python断言assertequal_python中那个断言assert的优化

    Python Assert 为何不尽如人意# Python中的断言用起来非常简单,你可以在assert后面跟上任意判断条件,如果断言失败则会抛出异常. Copy >>> assert ...

  9. java断言assert的概念_断言(assert)简介

    java中的断言assert的使用 一.assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,他是该版本再Java语言方面最大的革新. 从理论上来说,通 ...

最新文章

  1. 第五周项目三-时间类(1)
  2. 网络爬虫中进行数据抓取
  3. SPOJ - QTREE Query on a tree(树链剖分+线段树)
  4. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)
  5. es7 bulk api 批量插入es
  6. php实现一个简单的四则运算计算器
  7. linux 系统调用_Linux系统调用初学者指南
  8. docker使用之私有仓库构建(四)
  9. 实战来了!聊聊电商系统中红包雨功能的设计与实现
  10. ts(typescript)面向对象之类的继承
  11. 浏览器服务器文件夹在哪里找,IE临时文件夹在哪?Win7系统下如何查找临时文件夹...
  12. 深度学习之蛋白质二级结构预测
  13. 如何用计算机整理数据,总结:如何在excel中制作数据统计表(最简单的excel分类汇总教程)...
  14. android 接电话 返回后黑屏,安卓手机打电话黑屏原因和解决方法
  15. 嵌入式设备和固件中的自动漏洞检测(一):概览
  16. 互联网产品经理(PM)的工作内容和职责
  17. git pull某单个文件
  18. 国内的博客没几个能用,blogbus的功能和技术看来是不错的
  19. 能源结构优化与低碳化发展:低碳化指数-全国分地区能源消费结构
  20. Android基础篇-五大存储方式之一数据库存储

热门文章

  1. scrapy框架爬取Boss直聘,数据存入mysql
  2. linux块大小与分区大小问题
  3. cocos creater ios端 字库不生效
  4. APM32F103CBT6调试接口复用为GPIO配置问题
  5. 面试精选题:让我们像牛顿一样思考苹果
  6. 网页分段视频下载并将多个ts文件合并
  7. 微软官网下载Net Framework流程
  8. MES系统会采集哪些数据?数据采集方式有哪些?
  9. blink不能发,这里记录下
  10. 前端canvas实现图画工具