浅析Java断言
Java断言
1.断言的概念
Java的断言机制assert是一种用于测试阶段的语法特性,它允许我们在测试期间向代码中插入一些检查语句。代码发布时这些检测语句将被自动移除。
断言关键字assert有下列两种形式
- assert 条件;
- assert 条件:表达式;
当结果为false时,会抛出一个AssertionError异常。在第二种形式中,表达式将被传入异常的构造器,构造出你想要的一种消息字符串。
注意这个消息字符串仅在这个时候被创建并跟随异常展示出来,而不能以任何方式被保存。因为如果保存为一个内存中的变量,意味着断言机制可能脱离测试环境而影响到代码的真实运行。
例如,我们要断言x是一个正数,只需要使用以下形式。
assert x > 0;
也可以将x的值传递给异常构造器,从而显示。
assert x > 0 : x;
2. 启用和禁用断言
默认情况下断言被禁用,可以在运行程序时用-enableassertions或-ea这两个参数中的一个来启用。
启用和禁用断言时不需要重新编译程序,因为启用和禁用断言是类加载器的功能,而类加载器在解释字节码阶段运行。
也可以在某个类或者整个包中使用断言,如
java -ea:MyClass -ea:com.pedro.src... MyApp
这段代码将开启
MyClass类以及com.pedro.src包和它的所有子包中的断言。也可以用选项
-disableassertions或-da禁用某个特定类和包的断言java -ea:... -da:MyClass MyApp
3.使用断言完成参数检查
使用断言有两个需要注意的条件
- 断言失败应该是一种致命且不可恢复的错误。
- 断言检查只用于开发和测试阶段,它只用于程序员或测试人员确定程序内部的错误位置。
例如我们有一个方法签名
static void sort(int[] array,int x,int y){
...
}
我们希望拒绝null数组调用这个方法,那我们应该这样做。
static void sort(int[] array,int x,int y){
assert a != null;
...
}
这样的在方法开头检查参数的形式我们称为前置条件。
4.为文档中的假设使用断言
以下是一段示例代码,我们试图用注释的方式说明一个if-else分支中的假设。
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else // (i % 3 == 2)
...
我们也可以用断言做这件事
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...
但是实际上,如果我们是经验丰富的工程师,我们应该会考虑到i可能是一个负值,所以最好在 if 语句之前使用另一个断言。
assert i >= 0;
if (i X 3 == 0)
...
else if (i X 3 = 1)
...
else
assert i % 3 == 2;
...
浅析Java断言的更多相关文章
- 浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅析Java.lang.Process类
一.概述 Process类是一个抽象类(所有的方法均是抽象的),封装了一个进程(即一个执行程序). Process 类提供了执行从进程输入.执行输出到进程.等待进程完成.检查进程的 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
- Java断言assert
public class Welcome{ public static void main(String[] args){ assert false; System.out.println(" ...
- [转载]浅析Java中的final关键字
浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- java断言
public class New{ public static void main(String[] args){ assert false; System.out.println("pas ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- K:java 断言 assert 初步使用:断言开启、断言使用
@转自天地悠悠的个人博客 主要总结一下在eclipse中如何使用断言. (一)首先明确: java断言Assert是jdk1.4引入的. jvm 断言默认是关闭的. 断言是可以局部开启的,如:父类禁止 ...
- 浅析java内存管理机制
内存管理是计算机编程中的一个重要问题,一般来说,内存管理主要包括内存分配和内存回收两个部分.不同的编程语言有不同的内存管理机制,本文在对比C++和Java语言内存管理机制的不同的基础上,浅析java中 ...
随机推荐
- 打通“任督二脉”:Android 应用安装优化实战
疑问: (1)了解APK安装流程有什么好处 (2)了解APK安装流程可以解决什么问题 一.可以在安装流程里做什么 安装就分为下面三个阶段,每个阶段可以做些什么工作,可以帮助我们优化安装流程,解决安装后 ...
- 资源:jenkins下载路径
Jenkins版本下载路径 所有版本:http://mirrors.jenkins.io/war/
- ThreadLocal底层原理学习
1. 是什么? 首先ThreadLocal类是一个线程数据绑定类, 有点类似于HashMap<Thread, 你的数据> (但实际上并非如此), 它所有线程共享, 但读取其中数据时又只能是 ...
- Thread对象 既传入了Runnable对象又重写了run()方法
Thread本身是一个类,其run(): 正常情况下, target(即传入的new Runnable()对象)不为空,就是执行target里面的run方法 但是,重新run()方法之后,就不会在执行 ...
- MyEclipse中,编写properties文件,输入中文显示乱码
我在properties文件中输出中文,结果显示的是乱码,额......好吧,其实不是乱码,哪有这么规范的乱码 其实是在输入中文时发生了转码,就是下面这个样子: 字符集不支持中文,修改方法: 选中你工 ...
- buu RSA
一.分析 下载链接,发现一个公钥的文件(e,n),和一个加密过的文件 二. 公钥文件,里面一堆字母,然后后面百度,才知道需要去解开n,e 指数是e,模数是n(十六进制) 三.再通过n来分解素数,得到p ...
- OpenResty简介
OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项. 通过揉和众多设计良好的 ...
- Java基础00-接口21
1. 接口 1.1 接口概述 1.2 接口的特点 1.3 接口的成员特点 1.3.1 案例:猫和狗 public interface Jumpping { public void jump(); } ...
- 添加Lombok插件后调用Setter或Getter方法IDEA编译错误
虽然添加Lombok插件,但是调用Setter或Getter方法IDEA编译错误,主要原因如下 解决办法:
- mybatis-1-hellomybatis
一.先创建一个mybatis的数据表 USE `mybatis`; CREATE TABLE tbl_employee( id INT(11) PRIMARY KEY AUTO_INCREMENT, ...