- 浏览: 1337830 次
- 性别:
- 来自: 湖南澧縣
文章分类
最新评论
-
虾米小尹:
不行啊!2.2-0.25=1.9500000000000002 ...
JavaScript浮点数运算 —— 精度问题 -
heluping000000:
引用String a= "abc",首先在 ...
String,到底创建了多少个对象? -
mack:
谢谢分享matcher.appendReplacement(s ...
string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement -
wzt3309:
完全理解,比网上其他资料都要详细
String,到底创建了多少个对象? -
u014771876:
Java中十六进制转换 Integer.toHexString()
一、概述
在C和C++语言中都有assert关键,表示断言。
在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。
二、语法
在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。
assert关键字语法很简单,有两种用法:
1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
三、应用实例
下面给出一个例子,通过例子说明其用法:
public class AssertFoo {
public static void main(String args[]) {
//断言1结果为true,则继续往下执行
assert true;
System.out.println("断言1没有问题,Go!");
System.out.println("\n-----------------\n");
//断言2结果为false,程序终止
assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";
System.out.println("断言2没有问题,Go!");
}
}
保存代码到C:\AssertFoo.java,然后按照下面的方式执行,查看控制台输出结果:
1、编译程序:
C:\>javac AssertFoo.java
2、默认执行程序,没有开启-ea开关:
C:\>java AssertFoo
断言1没有问题,Go!
-----------------
断言2没有问题,Go!
3、开启-ea开关,执行程序:
C:\>java -ea AssertFoo
断言1没有问题,Go!
-----------------
Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
会在抛出异常的时候输出!
at AssertFoo.main(AssertFoo.java:10)
四、陷阱
assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中。应避免使用。笔者经过研究,总结了以下原因:
1、assert关键字需要在运行时候显式开启才能生效,否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你如果使用IDE工具编码,调试运行时候会有一定的麻烦。并且,对于Java Web应用,程序代码都是部署在容器里面,你没法直接去控制程序的运行,如果一定要开启-ea的开关,则需要更改Web容器的运行配置参数。这对程序的移植和部署都带来很大的不便。
2、用assert代替if是陷阱之二。assert的判断和if语句差不多,但两者的作用有着本质的区别:assert关键字本意上是为测试调试程序时使用的,但如果不小心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。
3、assert断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。但是使用断言就很危险,一旦失败系统就挂了。
五、对assert的思考
assert既然是为了调试测试程序用,不在正式生产环境下用,那应该考虑更好的测试JUint来代替其做用,JUint相对assert关键的所提供的功能是有过之而无不及。当然完全可以通过IDE debug来进行调试测试。在此看来,assert的前途一片昏暗。
因此,应当避免在Java中使用assert关键字,除非哪一天Java默认支持开启-ea的开关,这时候可以考虑。对比一下,assert能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。
以上仅仅代表我个人观点,欢迎大家留言讨论。
-----------------------------------------------------------------------------------
下面是一些Assert的例子:
assert 0 < value;
assert 0 < value:"value="+value;
assert ref != null:"ref doesn''t equal null";
assert isBalanced();
-----------------------------------------------------------------------------------
AssertinError类是Error的直接子类,因此代表程序出现了严重的错误,这种异常通常是不需要程序员使用catch语句捕捉的。
使用assert的准则:assert语句的作用是保证程序内部的一致性,而不是用户与程序之间的一致性,所以不应用在保证命令行参数的正确性。可以用来保证传递给private方法参数的正确性。因为私有方法只是在类的内部被调用,因而是程序员可以控制的,我们可以预期它的状态是正确和一致的。公有方法则不适用。此外,assert语句可用于检查任何方法结束时状态的正确性,及在方法的开始检查相关的初始状态 等等。
assert语句并不构成程序正常运行逻辑的一部分,时刻记住在运行时它们可能不会被执行。
-----------------------------------------------------------------------------------
两类参数:
参数 -esa和 -dsa:
它们含义为开启(关闭)系统类的assertion功能。由于新版本的Java的系统类中,也使了 assertion语句,因此如果用户需要观察它们的运行情况,就需要打开系统类的assertion功能 ,我们可使用-esa参数打开,使用 -dsa参数关闭。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。
参数 -ea和 -ea:
它们含义为开启(关闭)用户类的assertion功能:通过这个参数,用户可以打开某些类或包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,表示打开这些类或包;如果包名称后面跟有三个点,代表这个包及其子包;如果只有三个点,代表无名包。关闭 assertion功能参数为-da,使用方法与-ea类似。
-ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。
下面表格表示了参数及其含义,并有例子说明如何使用。
参数 例子 说明
-ea java -ea 打开所有用户类的assertion
-da java -da 关闭所有用户类的assertion
-ea: java -ea:MyClass1 打开MyClass1的assertion
-da: java -da: MyClass1 关闭MyClass1的assertion
-ea: java -ea:pkg1 打开pkg1包的assertion
-da: java -da:pkg1 关闭pkg1包的assertion
-ea:... java -ea:... 打开缺省包(无名包)的assertion
-da:... java -da:... 关闭缺省包(无名包)的assertion
-ea:... java -ea:pkg1... 打开pkg1包和其子包的assertion
-da:... java -da:pkg1... 关闭pkg1包和其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
-----------------------------------------------------------------------------------
不要再public的方法里面检查参数是不是为null之类的操作,例如:
public int get(String s){
assert s != null;
}
如果需要检查也最好通过 if s = null 抛出 NullPointerException来检查。
不要用assert来检查方法操作的返回值来判断方法操作的结果,例如:
assert list.removeAll();这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了,所以removeAll()操作就没有被执行,可以这样代替
boolean boo = list.removeAl();
assert boo;
-----------------------------------------------------------------------------------
另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API。下面简单说明一下几个API的作用。
ClassLoader类中的几个相关的API:
setDefaultAssertionStatus:用于开启/关闭assertion功能
setPackageAssertionStatus:用于开启/关闭某些包的assertion功能
setClassAssertionStatus: 用于开启/关闭某些类的assertion功能
clearAssertionStatus:用于关闭assertion功能
发表评论
-
Java正则表达式
2014-03-14 10:16 1766Java正则表达式详解 作者:jzj 文 ... -
类的初始化与清理
2013-06-24 22:20 1456初始化时内存清零 当创建一个对象时,首先将在堆上为这个对象分 ... -
protected,这个错了吗?
2013-06-24 22:17 1251这几天对protected修饰符有点迷糊,随便找同事要了一本 ... -
Java中BigDecimal的8种舍入模式
2013-06-21 18:42 2185java.math.BigDecimal不可变的、任意精度的 ... -
Tomcat性能参数设置
2010-12-27 15:35 34802默认参数不适合生产环境使用,因此需要修改一些参数 1、 ... -
Java 6 JVM参数选项大全
2010-12-14 11:16 1638http://kenwublog.com/docs/java6 ... -
对象的安全构造
2013-06-21 18:43 1546在构造期间,不要公布“this”引用 一种可以将数据争用引 ... -
eclipse调试
2010-06-04 00:11 8083eclipse远程调试 在eclipse3.4前,远程调试时 ... -
protected,你真的理解了吗?
2010-05-09 17:56 2149Java中的访问控制修饰符有四个级别,但属protected最 ... -
利用反射进行深层克隆
2010-05-05 21:02 3670最近在看《effective java ... -
类与类之间的几种关系
2010-05-03 13:49 2419类和类、类和接口、接 ... -
运行java
2010-05-03 13:47 1053用javac命令编译一个打包的类时,如果没有加参数" ... -
Java内存模型与volatile
2010-04-25 13:21 18796内存模型描述的是程序 ... -
中断线程
2010-04-24 21:19 8997中断线程 线程的thread.i ... -
java中的关键字、保留字、标示符
2010-04-07 23:48 3375关键字 Java的关键字对java的编译器有特殊的意义, ... -
Java中的浮点数剖析
2010-04-07 23:27 4723定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固 ... -
线程间的同步与互斥
2010-03-23 21:29 2305线程间的同步(实指线程间的通信):一般来说,一个线程相对于另 ... -
UTF-16、UTF-16BE、UTF-16LE编码方式的区别
2010-03-23 21:20 9819import java.io.IOException; ... -
final、finally、finalize
2010-01-22 01:15 2427final关键字 先看看final关键字,它可以被用于以下几个 ... -
方法能重写,属性能重写吗?
2010-01-22 00:56 6972覆写是多态的一种表现,我们平时所说的覆写一般是针对方式来说,在 ...
相关推荐
在JAVA中,可以使用`assert`关键字来声明断言,例如`assert value > 0;`,表示期望value的值大于0。如果断言的条件不满足,程序将抛出AssertionError。断言通常在开发和测试阶段启用,在生产环境中可以禁用,以提高...
描述中“详细介绍了Java陷阱之assert关键字”表明了文章将系统性地讲解assert关键字的各个方面,而“有需要的朋友可以参考一下”则意味着这篇文章为那些需要深入了解Java断言功能的开发者提供了参考。 在标签中,...
6. **什么时候用 assert** - 断言用于验证程序的假设条件是否成立,主要用于开发和测试阶段。 - 在生产环境中,通常会关闭断言以优化性能。 7. **String 对象创建** - `String s = new String("xyz");` 创建了...
JUnit通过提供一系列断言(Assert)方法,如`assertEquals()`用于比较预期结果与实际结果,`assertFalse()`和`assertTrue()`用于验证条件是否为真或假,`assertNotNull()`和`assertNull()`用于检查对象是否为空,`...
import static org.junit.Assert.*; public class MyClassTest { @Test public void testMethod1() { MyClass myObject = new MyClass(); int result = myObject.method1(); assertEquals(expectedValue, ...
总的来说,Java面试题中的这两个知识点——断言和JDBC——是Java开发者必备的基础技能,它们在程序调试、错误检测以及数据库操作中起着至关重要的作用。掌握这两点有助于编写更稳定、可维护的Java应用程序。
2. **断言与异常处理**:学习如何使用JUnit提供的各种断言方法(如assertEquals、assertTrue等)来验证预期结果,以及如何捕获和处理测试过程中可能出现的异常。 3. **测试设计原则**:讲解如何编写符合 Arrange-...
Java架构测试库——ArchUnit与最佳实践 在Java开发中,确保代码的架构质量是至关重要的,这有助于维持系统的可维护性、可扩展性和可测试性。ArchUnit是一款专门用于测试Java应用程序架构的库,它提供了强大的API,...
6. **断言(Assertion)**:在`compareResultToReportng`方法中,使用了`Assert.assertEquals()`进行断言,比较实际值和预期值是否相等。如果第一个预期值比对失败,后续的比对将不再进行;如果断言失败,程序会立即...
`assert`关键字在Java中用于断言,通常在测试和调试阶段使用,用来检查程序状态是否符合预期。在生产环境中,通常会关闭断言以提高性能。 垃圾收集器(Garbage Collector, GC)是Java的重要特性,它自动管理内存,...
除了异常处理和断言之外,Java还提供了一种更高级别的错误处理机制——错误处理。错误通常是不可恢复的情况,比如内存溢出或系统级错误。 - **错误处理**:错误处理通常涉及到系统级问题或资源耗尽的情况,这些问题...
单元测试是软件开发过程中的一个重要环节,其主要目的是验证软件中的最小可测试单元——通常是单个函数或者方法——是否按照预期的方式工作。通过单元测试,开发者可以在早期阶段发现并修复错误,从而提高软件的质量...
9. **断言验证**: 测试脚本通常需要进行断言来验证预期的结果是否实现。例如,`Assert.assertTrue(driver.getTitle().contains("Welcome"))`可以检查页面标题是否包含"Welcome"。 10. **测试框架集成**: Selenium...
它不仅是Java编程语言的事实标准单元测试库,而且其设计思想——测试先行和测试驱动的开发(TDD),极大地推动了软件工程实践的发展。JUnit的白盒测试特性,意味着开发者可以深入到代码内部,针对特定接口和方法编写...
通过本文介绍的技术栈组合——Selenium + Java + TestNG + Maven,可以构建出一套高效、灵活且易于维护的自动化测试框架。通过对 Selenium 和 TestNG 的封装,大大降低了测试脚本的复杂度,同时通过 ReportNG 生成...
Java语言的第三章主要讲解了Java程序的基本构造单元——语句。语句是程序中执行特定任务的最小语法单位,通常包含表达式。本章详细介绍了多种类型的语句及其应用场景。 1. 空语句:仅包含一个分号,不执行任何操作...
每个测试类都是JUnit TestCase类的子类,通过Assert类执行断言来测试应用功能。测试活动时,ActivityInstrumentationTestCase2类允许使用探测功能,实现UI测试自动化,通过触摸事件模拟用户交互。 整体上,本文提出...
单元测试是对程序中的最小可测试部分——通常是一个函数或方法——进行检查,确保其按照预期工作。JUnit作为Java生态的一部分,极大地提高了开发效率和代码质量。 在Java开发中,JUnit的重要性不言而喻。它提供了...