`
MauerSu
  • 浏览: 509300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

    博客分类:
  • J2SE
 
阅读更多
源:http://blog.csdn.net/leichelle/article/details/7951321
评:"VM Arguments" 中填入-ea选项。才能让断言在运行时起作用。
一、语法形式:
    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 chai";
         //String 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,才能正确编译。

同时,要想让断言起效用,即让断言语句在运行时确实检查,在运行含有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
分享到:
评论

相关推荐

    Java中断言使用案例

    在Java编程语言中,"断言"是一种强大的调试工具,它允许程序员在代码中插入条件检查,以确保程序在特定点的行为符合预期。这个概念在【标题】"Java中断言...正确理解和使用断言,可以帮助开发者更好地维护和优化代码。

    Assert使用

    `Assert` 通常在 C++、Java、C# 和 Python 等多种编程语言中被使用,它的主要功能是检查程序中的条件是否满足,如果条件不满足,即断言失败,程序会抛出一个错误或者终止执行,这对于找出代码中的逻辑错误非常有帮助...

    JAVA程序设计——异常和断言

    总的来说,理解并熟练运用JAVA的异常处理和断言机制,可以帮助开发者编写出更加健壮、易于维护的代码,减少运行时错误,提高软件的质量和用户体验。在实际编程中,应根据具体需求和场景合理地应用这些技术,平衡程序...

    Java陷阱之assert关键字详解

    描述中“详细介绍了Java陷阱之assert关键字”表明了文章将系统性地讲解assert关键字的各个方面,而“有需要的朋友可以参考一下”则意味着这篇文章为那些需要深入了解Java断言功能的开发者提供了参考。 在标签中,...

    Selenium-java断言(90)【2021-02-02】.docx

    在Java中,我们可以利用JUnit或TestNG这样的测试框架来组织和执行测试用例,这些框架提供了丰富的断言库。例如,JUnit中的`Assert.assertEquals()`方法可以用于检查网页元素的文本内容或属性值是否符合预期。 在...

    编程语言JAVA断言使用.pdf

    在上述文档内容中,我们可以看到两个示例程序,它们展示了如何在Java代码中使用断言,并且涉及了在使用断言时的一些关键点。 第一个示例程序是`AssertExampleOne`类: ```java public class AssertExampleOne { ...

    SCJP 310-055 题库4 异常和断言

    然而,由于条件判断语句中使用了错误的逻辑运算符`|`(按位或),而不是`||`(逻辑或),这会导致编译失败,因为`|`不能用于`null`和`int`之间的操作。 **Question3**:`test()`方法声明了它可能会抛出`...

    json-path-assert-2.1.0.zip

    这个库允许开发人员在 Java 代码中使用 JSON Path 表达式来查询 JSON 文档,并获取匹配的结果。在测试框架如 JUnit 或 TestNG 中,可以利用 JsonPath 进行断言,确保 API 返回的 JSON 数据与预期相符。 在 `...

    Java常用词汇中英文对照

    Java常用词汇中英文对照 本文档提供了Java常用词汇的中英文对照,涵盖了许多术语的中英文对照,旨在帮助开发者更好地理解Java编程语言。... assert是Java中的一种断言机制,用于检查代码正确性。 ...

    Java二级.zip

    虽然现代Web开发中Applet的使用已经减少,但理解其工作原理对学习Java Web编程有一定的历史价值。 通过深入学习以上知识点,不仅可以掌握Java二级考试的核心内容,还能为实际的Java开发工作打下坚实的基础。这些...

    基于java的ui自动化测试框架

    Java中的Assert类提供了基本的断言方法,而JUnit和TestNG提供了更丰富的断言选项,如assertEquals、assertTrue等,便于进行复杂的条件验证。 在压缩包文件`com_test2`中,我们可以推测这是项目的一个源代码包,可能...

    JAVA中licence控制实现示例

    在Java编程环境中,许可证(Licence)控制是一个重要的实践,特别是在商业软件开发中,用于确保软件的合法使用和防止非法复制。本示例将聚焦于如何在Java中实现许可证管理功能,通过`KeyGenerater`类和JUnit测试来...

    Assertions-in-java.rar_REvision_site:www.pudn.com

    在本复习资料中,我们将深入探讨Java断言的概念、用法以及其在软件开发过程中的重要性。 1. **断言概念** 断言是一种编程语句,用于声明某个点上的程序状态。它包含一个布尔表达式,该表达式预期为真。如果表达式...

    Appium Java使用po实例和封装打包

    总之,Appium Java测试中,利用PO模式可以提高代码的可读性和可维护性,断言确保了预期结果的正确性,而封装打包则方便了测试用例的管理和执行。理解并熟练运用这些技术,对于提升移动应用自动化测试的质量和效率至...

    java面试中的陷阱java面试中的陷阱

    在Java面试过程中,面试官往往会通过一些问题来考察应聘者对Java基础知识的理解深度以及在实际编程中解决问题的能力。本文将根据提供的标题、描述及部分内容,整理并归纳出一系列常见的Java面试陷阱,帮助求职者更好...

    Junit测试Void方法

    在 Junit 中,大部分的测试都是基于断言来进行的,即通过比较预期结果和实际结果来验证方法的行为是否正确。然而,对于 `void` 类型的方法,它们通常用来执行某些操作而不返回任何值,这意味着我们无法获取到一个...

    单元测试之道Java版使用JUnit

    在Java编程中,JUnit是一个广泛使用的开源测试框架,专为Java应用程序设计,它提供了丰富的API和工具,使得编写和执行单元测试变得简单、高效。本篇文章将深入探讨JUnit在Java单元测试中的应用和相关知识点。 首先...

    java中的关键字大全

    `import`用于导入类或包,以便在当前文件中使用。 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); } } ``` ##### ...

    单元测试之道Java版-使用JUnit

    此外,还提供了一个名为“单元测试之道Java版-使用JUnit”的文件,这可能是一个源代码库,读者可以实际操作和学习,加深对书中理论的理解。 在Java开发中,单元测试通常是通过创建独立的小型测试类来完成的,这些...

Global site tag (gtag.js) - Google Analytics