编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设 断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。 使用断言可以创建更稳定,品质更好且易于除错的代码
当需要在一个值为FALSE时中断当前操作的话,可以使用断言,单元测试必须使用断言(Junit/JunitX) ,除了类型检查和单元测试外,断言还提供了一种确定各种特性是否在程序中得到维护的极好的方法, 使用断言使我们向按契约式设计更近了一步。
常见的断言特性
前置条件断言:代码执行之前必须具备的特性
后置条件断言:代码执行之后必须具备的特性
前后不变断言:代码执行前后不能变化的特性
断言使用方式
断言可以有两种形式
引用
1、assert Expression1
2.assert Expression1:Expression2
其中Expression1应该总是一个布尔值,Expression2是断言失败时输出的失败消息的字符串。如果Expression1为假,则抛出一个 AssertionError,这是一个错误,而不是一个异常,也就是说是一个不可控制异常(unchecked Exception),AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。
启用断言
断言在默认情况下是关闭的,要在编译时启用断言,需要使用source1.4标记 既javac source1.4 Test.java ,在运行时启用断言需要使用 -ea参数 。要在系统类中启用和禁用断言可以使用 -esa 和 -dsa参数。
例如:
public class AssertExampleOne{
public AssertExampleOne(){}
public static void main(String args[]){
int x=10;
System.out.println("Testing Assertion that x==100");
assert x=100:"Out assertion failed!";
System.out.println("Test passed!");
}
}
如果编译时未加 -source1.4,则编译通不过
在执行时未加 -ea 时输出为
引用
Testing Assertion that x==100
Test passed
jre忽略了断言的旧代码,而使用了该参数就会输出为
引用
Testing Assertion that x==100
Exception in thread "main" java.lang.AssertionError:
Out assertion failed!
at AssertExampleOne.main(AssertExampleOne.java:6)
断言的副作用
由于程序员的问题,断言的使用可能会带来副作用 ,例如:
boolean isEnable=false;
//... assert isEnable=true;
这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。
public class AssertExampleTwo{
public static void main(String args[]){
boolean isEnable=false;
//...
assert isEnable=true;
if(isEnable==false){
throw new RuntimeException("Assertion shoule be enable!");
}
}
}
何时需要使用断言
引用
1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false
2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
3.使用断言测试方法执行的前置条件和后置条件
4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)
什么地方不要使用断言
断言语句不是永远会执行,可以屏蔽也可以启用
因此:
引用
1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值
Assert最好不要滥用,原因是assert并不一定都是enable的,下面两种情况就不应该用assert
1、不要再public的方法里面检查参数是不是为null之类的操作
例如
引用
public int get(String s){
assert s != null;
}
如果需要检查也最好通过if s = null 抛出NullPointerException来检查
2、不要用assert来检查方法操作的返回值来判断方法操作的结果
例如
assert list.removeAll();
这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了 所以removeAll()操作就没有被执行
可以这样代替
boolean boo = list.removeAl();
assert boo;
下面是我的测试代码:
public class AssertTest{
public static void main(String[] args){
AssertTest at = new AssertTest();
try {
at.assertMe(true);
at.assertMe(false);
} catch (AssertionError e) {
e.printStackTrace();
System.out.println("断言为假!!!");
}
System.out.println("go on !!!!");
}
private void assertMe(boolean boo){
int s = 0;
assert boo:++s; //当boo 为真时,assert语句将被忽略,对应的++s 也不会执行,当boo为假时,assert中的第二个参数表达式将会被执行,并且将结果作为构造AssertError的参数,并且抛出AssertError错误
System.out.println(boo+" condition "+s);
}
}
分享到:
相关推荐
在探讨Java编程语言中的断言使用时,我们首先需要了解断言是一种...在解释和整理文档内容时,我已经尽量使信息通顺且符合逻辑,但可能存在理解上的偏差,因此在实际应用时,还需结合最新的Java文档和开发实践进行操作。
### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...
Java常用工具类整理 本文将详细介绍 Spring 及 Guava 相关工具类的使用说明和代码 demo。这些工具类都是 Java 开发中常用的实用工具,可以帮助开发者快速高效地完成各种任务。 一、Spring 工具类 1. org.spring...
Java编程语言复习重点整理 1. **访问修饰符的区别**: - `public`:所有类都可以访问。 - `private`:仅限于在同一类内部访问。 - `protected`:同一包内的类和任何子类可以访问。 - 默认(friendly):同一包...
本压缩包"java_常用jar包整理.rar"显然是一份集合了Java开发中常用库的资源,可以帮助开发者快速搭建项目环境或解决特定功能需求。以下将详细解析这些常见的jar包及其在Java开发中的作用。 1. **Apache Commons**: ...
Java8其他相关学习博文Java8 Stream 流教学教程如何在Java8中风骚走位无意空指针异常Java8 发行篇(一) | 线程与执行器目录一、接口内允许添加默认实现的方法二、Lambda 表达式三、函数式接口 函数式接口四、方便的...
- `AssertionError`:断言失败时抛出,用于测试目的。 - `ClassCircularityError`:类之间的循环依赖导致初始化失败。 - `ClassFormatError`:类文件格式不正确,无法被Java虚拟机解析。 - `...
【Java面试核心知识点详解】 1. **final, finally, finalize的区别** - `final`:这是一个修饰符,用于声明不可变的类、变量或方法。当一个类被声明为`final`,它不能有子类;一个`final`变量一旦初始化后就不能...
6. **assert**:用于断言,用于测试代码中的假设,在开发阶段帮助找出错误。 7. **String 对象创建**:`String s = new String("xyz");`创建了两个对象,一个在常量池,一个在堆。`String`对象是不可变的,因此每次...
### Java面试题详解 #### 1. Java 异常处理机制 Java的异常处理机制是其安全性的重要组成部分。当程序运行时遇到意外情况,如数组越界、空指针访问等,Java会抛出异常来通知程序员有错误发生。异常处理主要通过`...
JUnit是Java中广泛使用的单元测试框架,它允许开发者编写断言来验证方法的行为。此外,Mockito等工具可以用来模拟依赖关系,以便孤立地测试目标代码。 2. **集成测试模式** 集成测试是在所有模块单元测试通过后...
14. **单元测试**:JUnit是Java中的单元测试框架,学习如何编写测试用例,进行断言和异常测试,确保代码质量。 以上是【宋红康java笔记】中可能涵盖的部分重要知识点,每个主题都值得深入研究和实践。通过学习这些...
### Java企业面试题知识点梳理 #### 一、Java面向对象基础 **1. super()与this()的区别** - **super()**: 是指父类构造器的引用,用于调用父类的构造方法或访问父类的成员。在子类构造器中使用 `super()` 可以调用...
### Java面试宝典知识点梳理 #### 一、访问修饰符的作用范围 - **Public**: 公开的,可以在任何地方被访问。 - **Protected**: 受保护的,只能在同一包内或者子类中访问。 - **Friendly (Default)**: 默认的,即...
根据提供的文件信息,这里将对其中提及的关键Java概念和知识点进行详细解释: ### final, finally, finalize #### final `final` 是一个关键字,在 Java 中用于限制类、方法或变量的行为: - **类**: 当一个类被...
根据提供的文件信息,我们可以整理出以下关键的Java知识点: ### 1. 异常处理机制 **异常**是Java程序中出现的一种特殊错误状态。Java中的异常分为两大类:检查性异常(checked exceptions)和非检查性异常...
在Java中,`assert`关键字用于编写断言语句,它用于调试阶段检测程序的假设条件是否成立。当程序运行时,如果断言表达式的值为`false`,则会抛出`AssertionError`异常。 为了启用或禁用断言,可以在命令行中使用...
### JAVA面试题集知识点解析 #### 一、Java与C++中的异常处理机制对比 - **Java中的异常处理**:Java通过内置的异常处理机制来管理程序运行时可能发生的错误情况。当Java程序中出现异常时,系统会抛出一个异常对象...
### JAVA面试题目整理知识点 #### 1. 区别作用域 public, private, protected, 以及不写时的区别 - **public**: 当方法或者变量声明为`public`时,可以在任何地方被访问,包括同一个包内以及其他包内的类。 - **...
这篇博客是关于Java 5.0新特性——Annotation的系统学习与整理笔记,通过讲解与实例,深入探讨了注解在Junit、Spring和Hibernate中的应用。 首先,注解是一种声明式的编程元素,它可以附加到类、接口、方法、变量等...