如何在Java中应用断言Assert

简介:


《Java编程艺术》章节选登。作者:高永强 清华大学出版社 (即将出版)

11.9  断言——assert

断言语句 assert JDK1.4 中首次提供,专门用来进行代码测试和纠错,以提高程序的可靠性。它可以被应用在程序中的任何位置,也被称为运行断点。编程人员在 assert 语句中提供测试数据的范围或者条件,作为断言或者声明( assertion )。例如,年龄必须大于 18 岁,提供的断言则是:
 
age > 18
 
如果断言为真,即代码中变量 age 的值大于 18 ,程序将正常运行;而断言为假时,这个断言异常将被 JVM 抛出,程序将停止运行,并且打印这个异常信息。
断言语句是一种特殊语句,因为它在运行时可以被设置为开启或者关闭。断言关闭是许多 IDE 系统预设的状态,在运行时, JVM 将忽略代码中所有断言语句,所以程序可以更加有效地运行。而需要执行断言时,可设置断言开启选项。在操作系统中利用 Java 指令运行程序时,必须输入开启断言选项。
如下小节将讨论断言语句的编写、断言状态设置,以及它的应用。

11.9.1  断言编写

断言语句的语法格式如下:
 
assert booleanExpression [: message];
 
assert —— Java 关键字。
booleanExpression ——布尔代数表达式,为声明的断言。
[:message] ——可选项。需要打印的字符串异常信息。
注意,断言语句以分号结束。
为了代码可读性,布尔代数表达式一般用括号括起。下面讨论几个具体例子:
1
 
// 完整程序存在本书配套资源目录 Ch11 中名为 AssertTest.java
int age = 17;
assert (age > 18) : "Age must be greater than 18";
 
这个例子中的断言语句声明变量 age 必须大于 18 ,否则将抛出断言异常。这段代码运行后,程序将停止运行,并打印如下信息:
 
Exception in thread "main" java.lang.AssertionError: Age must be greater than
18.
at AssertTest.main(AssertTest.java:11)
 
如果 age 的值大于 18 ,符合断言,程序将继续正常运行。
2
 
// 完整程序存在本书配套资源目录 Ch11 中名为 AssertTest.java
double total = 219.98;
assert (total > 0 .0 && total < 200.0) : "total: " + total + " – out of the
rang e .";
 
        这段代码运行后,程序将停止运行,并将打印如下信息:
 
Exception in thread "main" java.lang.AssertionError: total: 219.98 – out of
the range.
at AssertTest.main(AssertTest.java:10)
 
然而,如果 total 的值在声明的断言范围之内,程序将继续正常运行。
        如果我们利用 if 语句模拟断言语句的执行功能,上面的例子可以编写如下:
 
// 完整程序存在本书配套资源目录 Ch11 中名为 AssertTest.java
double total = 219.98;
if (total <= 0.0 || total >= 200.0) {  // 超出合法值范围
    System.out.println("total: " + total + " – out of the rang e. ");
    System.out.println("at AssertTest.main(AssertTest.java:10) ");
    System.exit(0);
}
 
这段代码运行后,程序将停止运行,并将打印如下信息:
 
total: 219.98 – out of the range.
at AssertTest.main(AssertTest.java:10)

11.9.2  开启和关闭断言

        在编译时必须设置断言语句为开启状态,即设立编译选项 -ea ,断言语句才参与运行。 ea enable assertion ,可分如下几种设置情况:
l   在操作系统中利用 java 对已经编译的程序运行时,加入断言开启选项 -ea 。如:
       java —— ea ClassName
        如果使用:
 
java ClassName.
 
        再次对该程序运行时,断言语句将关闭, JVM 将忽略程序中的所有断言语句。
 
更多信息    也可以利用 java –da ClassName 关闭断言语句并运行这个程序。 da disable assertion
 
l   Eclipse 中设置断言语句状态。其步骤如下:
       Run 菜单
 
Run...
Arguments
 
        VM Arguments 窗口中,输入:
 
-ea ,或者 -enableassertions
Apply
Run
 
        如果需要关闭断言设置时,进入 VM Arguments 窗口,删除输入的设置即可。
l   TextPad 中设置断言语句状态。其步骤如下:
Configure 菜单
Preference
Tools
Run Java Application
 
        Parameters 的窗口条中的开始输入:
 
-ea ( 注意 , -ea 后必须留有一个空格 )
确定
 

       如果需要在TextPad中关闭断言设置时,在Parameters窗口条中删除输入的设置即可。


















本文转自高永强51CTO博客,原文链接:http://blog.51cto.com/yqgao/156706 ,如需转载请自行联系原作者

相关文章
|
14天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
15天前
|
缓存 算法 Java
Java内存管理与调优:释放应用潜能的关键
【4月更文挑战第2天】Java内存管理关乎性能与稳定性。理解JVM内存结构,如堆和栈,是优化基础。内存泄漏是常见问题,需谨慎管理对象生命周期,并使用工具如VisualVM检测。有效字符串处理、选择合适数据结构和算法能提升效率。垃圾回收自动回收内存,但策略调整影响性能,如选择不同类型的垃圾回收器。其他优化包括调整堆大小、使用对象池和缓存。掌握这些技巧,开发者能优化应用,提升系统性能。
|
27天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
14天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第3天】 在Java并发编程中,线程池是一种重要的资源管理工具,它能有效地控制和管理线程的数量,提高系统性能。本文将深入探讨Java线程池的工作原理、应用场景以及优化策略,帮助读者更好地理解和应用线程池。
|
21天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
23天前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
5天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
14 1
探秘jstack:解决Java应用线程问题的利器
|
9天前
|
XML JSON JavaScript
Java中XML和JSON的比较与应用指南
本文对比了Java中XML和JSON的使用,XML以自我描述性和可扩展性著称,适合结构复杂、需验证的场景,但语法冗长。JSON结构简洁,适用于轻量级数据交换,但不支持命名空间。在Java中,处理XML可使用DOM、SAX解析器或XPath,而JSON可借助GSON、Jackson库。根据需求选择合适格式,注意安全、性能和可读性。
23 0
|
15天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
16天前
|
安全 Java 容器
Java并发编程:实现高效、线程安全的多线程应用
综上所述,Java并发编程需要注意线程安全、可见性、性能等方面的问题。合理使用线程池、同步机制、并发容器等工具,可以实现高效且线程安全的多线程应用。
14 1