断言概述

编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设

可以将断言看作是异常处理的一种高级形式

断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真

可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新起用断言。

使用断言可以创建更稳定,品质更好且易于除错的代码

当需要在一个值为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.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值

参考:

java字符串型断言消息_Java断言相关推荐

  1. java 字符串指定编码输出_java对字符的编码处理

    在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理. 1. getBytes(charset) 这是java字符串处理的一个标准函数,其作用是将 ...

  2. java 字符串首字符大写_Java字符串为大写

    java 字符串首字符大写 Java String to uppercase conversion can be done using toUpperCase() method. 可以使用toUppe ...

  3. java字符串与数组比较_Java字符串与数组

    问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.5字符串与数组 1.字符串创建与存储的机制是什么? Java中字符串声明与初始化主要有两种情况: (1)Stri ...

  4. java发送微信模板消息_java微信公众平台之发送模板消息

    准备条件: 1.一个测试号,有必要说下的是订阅号没有发送模板消息这一功能,那么开发的小伙伴们就可以直接先注册一个测试号 2.目前我并没有就是做的很完善,网页授权获取openId这个我没做,那么我是直接 ...

  5. 用集合java字符串第一个单词_Java小程序 输入一个字符串,将每一个单词首字母大写...

    Java 小程序 01 输入一个字符串,将每一个单词首字母大写 1.首先写一个接收传入的单词,并将传入单词首字母大写.这一步比较简单,没什么好说的! private String titleCase ...

  6. java字符串 n换行符_java切割字符串中的回车应注意是\n\r不是\n

    我们在Java中如果用到处理要分隔字符串,不免会用到String的split(String regex)函数,这时候我们要注意的. 如果想以回车来分隔字符串,很多同学都会这样做.下面是例子: Stri ...

  7. java字符串标胶大小_Java 标签上显示string长度如果超出标签大小

    展开全部 字符串String长度超出,会自动截取字符串,后面的以"..."三个小点代替. 保证真个字符串显示的长e68a843231313335323631343130323136 ...

  8. java 字符串包含某个字符_java中判断字符串中是否包含某个特定字符串的方法有哪些...

    判断一个字符串是否包含某个子串的n种方法: 1.startsWith()方法 2.contains()方法 3.indexOf方法 startsWith()方法 这个方法有两个变体,用于检测字符串是否 ...

  9. java 字符串转成图片_java 转换图片为字符串,将字符串转换成图片显示

    java 转换图片为字符串,将字符串转换成图片显示, 该方法只适用于比较小的图片传输,50K以内: try{ // 将图片转换成字符串 File imgFile = new File("f: ...

最新文章

  1. 简述事件接口与事件适配器的联系与区别_设计模式——适配器模式
  2. [总结]Asp.net中的页面乱码的问题
  3. java分批查询oracle数据库_数据库的分批查询问题
  4. hdu 1014 Uniform Generator 数论
  5. Monthly Expense【二分】
  6. 【今日CV 计算机视觉论文速览】Wed, 27 Mar 2019
  7. 微信小程序 android内存暂用,微信小程序与手机APP占用内存 流量消耗对比介绍
  8. JSK-388 等差数列【入门】
  9. python工资一般多少-Python工资一般是多少 看完吓你一跳
  10. 在线qmc0转换mp3工具_音乐格式转换
  11. POJ 1442 Black Box 优先队列
  12. python 自动办公ppt_python自动化办公操作PPT的实现
  13. linux常用网络命令大全
  14. 高斯过程回归(GPR)
  15. Tukey‘s test方法 异常值
  16. 轨迹优化 | Minimum-jerk
  17. 【Unity3D】使用 FBX 格式的外部模型 ② ( FBX 模型与默认 3D 模型的区别 | FBX 模型贴图查找路径 | FBX 模型可设置多个材质 )
  18. 贴个图,讲下技巧如何进入9008模式:记一次救砖小米note3-9008刷小米note3-小米note3miui10降级miui9
  19. 使用Docker一键部署MongoDB
  20. .NET在蹉跎中一路前行1

热门文章

  1. ad导入pcd后网络标号消失_如何将后端BaaS化:业务逻辑的拆与合
  2. Python+OpenCV:仿射变换和透射变换
  3. HALCON不同图像格式保存时间对比表
  4. linux oracle 12170,ora-12170 linux
  5. 为什么我会觉得SegmentFault做得越来越力不从心了?
  6. 深入理解SpringCloud之Eureka注册过程分析
  7. Windows 下安装 tensorflow keras opencv 的避坑指南!
  8. 《健康报》携手健康之路帮助医院医生免费搭建微官网
  9. 《C语言及程序设计》实践参考——体重监测器
  10. PLinux设计初步设想