理解和正确使用Java中的断言(assert)

原创 2004年08月28日 15:08:00
理解和正确使用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包及其子包中的断言无效。
Copyright by abnerchai, 2004. you can contact me at: abnertsai@sina.com

java assert 断言

一、assertion的意义和用法 J2SE 1.4在语言上提供了一个新特性,就是assertion功能,它是该版本在Java语言方面最大的革新。 从理论上来说,通过 assertion方式可...
  • u012506661
  • u012506661
  • 2016-10-04 10:55:05
  • 2355

Java —— Exception、Error 与 assert(断言)

断言语句在调试代码阶段非常有用,一般用于程序不准备通过捕获异常来处理的错误。在代码调试阶段让断言语句发挥作用,这样就可以发现一些致命的错误,当程序正式运行时,关闭断言语句但仍让其保留,可用于以后可能的...
  • qq_19865749
  • qq_19865749
  • 2017-09-04 17:35:58
  • 260

理解和正确使用Java中的断言(assert)

一、语法形式:     Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的 语法形式有如下所示的两种形式: 1、assert co...
  • u010142437
  • u010142437
  • 2016-05-12 22:14:27
  • 10743

Java - 什么时候用断言(assert)?

断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,断言用于保证程序最基本、关键的正确性。断言检查通常在开发和测试时开启。为了保证程序的执行效率,在软件发布后断言检查通常是关...
  • chimomo
  • chimomo
  • 2017-10-26 15:18:22
  • 281

理解 assert()断言

头文件:assert.h assert即断言,也即做出一些假设,程序运行时如果假设不成立,程序就会中断。没有很多调试经验,可能不太理解断言在哪会用到,实际上我们在调试一个出错的程序时,由于程序出错的...
  • gogogo_sky
  • gogogo_sky
  • 2016-11-30 21:30:07
  • 1070

【Java基础】——断言assert使用

前言              assert是Java中关键字,表示断言。在jdk1.4之后引入的,编译器默认不开启断言。与使用assertEquals,assertNotNull类似的方法不一样,...
  • jiadajing267
  • jiadajing267
  • 2017-09-10 15:22:59
  • 297

理解和正确使用Java中的断言(assert)

理解和正确使用Java中的断言(assert) 一、语法形式:     Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的 ...
  • qq_29027865
  • qq_29027865
  • 2016-10-24 15:15:42
  • 256

深入理解断言assert()函数(待整理)

 assert()函数用法总结   assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include assert.h> void asse...
  • gggg_ggg
  • gggg_ggg
  • 2014-12-18 11:26:21
  • 1104

Java实例说明 你会玩断言(assert)吗?

你会玩断言(assert)吗?
  • HZ_LIZX
  • HZ_LIZX
  • 2017-02-13 16:53:43
  • 281

Java断言assert的使用方法

   什么时候用assert.断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true.如果表达式计算为 false,那么系统会报告一个 AssertionError.它用于调试目的:...
  • xiaojianpitt
  • xiaojianpitt
  • 2008-07-23 17:50:00
  • 3098
收藏助手
不良信息举报
您举报文章:理解和正确使用Java中的断言(assert)
举报原因:
原因补充:

(最多只允许输入30个字)