java断言——Assertion

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java断言——Assertion 的相关知识;


【1】使用断言

1.1)断言机制: 允许在测试期间向代码中插入一些检查语句。 当代码发布时, 这些插入的检测语句将被自动地移走;

  • 1.1.1)java 引入了 关键字assert, 有两种形式:
    assert 条件; 和 assert 条件:表达式;
  • 1.1.2)以上两种形式 都会对条件进行检测: 如果结果为 false, 则抛出一个 AssertionException异常, 在第二种形式中, 表达式将被传入 AssertionError 的构造器中,并转换成一个 消息字符串;

Annotation)

  • A1)表达式部分的唯一目的是产生一个消息字符串;
  • A2) AssertionError 对象并不存储表达式的值, 因此,不可能在以后得到它;
  • A3)如JDK 所说, 如果使用表达式的值, 就会鼓励coders 试图从断言中恢复程序的执行, 这不符合断言机制的初衷;

1.2)看个荔枝:

  • 1.2.1)要想断言x 是一个 非负数值, 只需要简单地使用下面这条语句:assert x >=0;
  • 1.2.2)或者:将 x 的实际值传递给 AssertionError 对象, 从而可以在后面显示出来, assert x >=0 : x; (因为x 将被传入AssertionError 构造器, 并转换为一个消息字符串)

【2】启用和禁用断言

2.1)默认情况下, 断言被禁用。可以在运行程序时用 -enableassertions 或-ea 选项启用它:
java -enableassertions MyApp

  • 2.1.1)需要注意的是: 在启用或禁用断言时不必重新编译程序。启用和禁用断言是类加载器的功能, 当断言被禁用时, 类加载器将跳过断言代码, 因此,不会降低程序运行的速度;
  • 2.1.2)也可以在某个类或某个包中使用断言: 如, java -ea:MyClass -ea:com.mycompany.lib … MyApp
  • 2.1.3)也可以使用选项 -disableassertions 或 -da 禁用某个特定类和包的断言: java -ea:… -da:MyClass MyApp

Attention)

  • A1)有些类不是由类加载器加载, 而是直接由虚拟机加载。 可以使用这些开关有选择地启用或禁用那些类中的断言;
  • A2)然而, 启用和禁用所有断言的 -ea 和 -da 开关不能应用到那些没有类加载器的系统类上; 对于这些系统类来说, 需要使用 -enablesystemassertions/-esa 开关来启用断言;
    这里写图片描述

【3】使用断言完成参数检查

3.1)在java中, 给出了 3种处理系统错误的机制(Mechanism):

  • M1)抛出一个异常;
  • M2)日志;
  • M3)使用断言;

3.2)什么时候应该选择使用断言呢?记住下面几点(Points):

  • P1)断言失败是致命的, 不可恢复的;
  • P2)断言的检查只用于开发和测试阶段;
    所以, 不应该使用断言向程序的其他部分通告发生了可恢复性的错误, 或者, 不应该作为程序向用户通告问题的手段。 断言只应该用于在测试阶段确定程序内部的错误位置;

3.3)看个荔枝:

  • 3.3.1)文档指出, 如果方法中使用了错误的下标值,那么就会抛出一个异常, 这是方法与调用间约定的处理行为;
  • 3.3.2)如果对这个方法做个改动:
    @param a the array to be sorted (must not be null)
    现在, 这个方法的调用者就必须注意了: 不允许用null 数组调用这个方法, 并在这个方法的开头使用断言: assert a!=null;
  • 3.3.3)前置条件:计算机科学家把这种约定称为前置条件;最初的方法对参数没有前置条件, 即承诺在任何条件下都能够给予正确的执行;修订后的方法有一个前置条件, 即 a 非空;
  • 3.3.4)如果调用者在调用这个方法时没有提供满足这个前置条件的参数, 所有的断言都会失败, 并且这个方法可以执行它想做的任何操作;

【4】为文档假设使用断言

Conclusion)断言和日志记录的区别: 断言是一种测试和调试阶段所使用的战术性工具, 而日志记录是一种在程序的整个生命周期都可以使用的策略性工具;

  • API java.lang.ClassLoader 1.0
    void setDefaultAssertionStatus(boolean b) 1.4 : 对于通过类加载器的所有类来说, 如果没有显式地说明类或包的断言状态, 就启用或者禁用断言;
    void setClassAssertionStatus(string className, boolean b) 1.4 :对于给定类和它的内部类, 启用或者禁用断言;
    void setPackageAssertionStatus(string packageName, boolean b) 1.4 :对于给定包或其子包中的所有类, 启用或禁用断言;
    void clearAssertionStatus() 1.4 :移除所有类和包的显式断言状态设置, 并禁用所有通过这个类加载器加载的类的断言;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的并发模型_两个常见的并发错误

常见的并发模型作为Baeldung的编辑,我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章。 这是一本不错的书,但是假设开发人员具有一定的能力。 我已经看到了几件即时并发失败的事情。 它们很容易添加到代码中,并保证为您提供奇怪的结果…

java 哈希一致算法_一致哈希算法Java实现

一致哈希算法(Consistent Hashing Algorithms)是一个分布式系统中常用的算法。传统的Hash算法当槽位(Slot)增减时,面临所有数据重新部署的问题,而一致哈希算法确可以保证,只需要移动K/n份数据(K为数据总量, n为槽位数量),且只影响…

java日志——基本日志+高级日志

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 java日志——基本日志高级日志 的相关知识; 【1】记录日志 1.1)出现的问题和解决方法: 1.1.1)出现的问题:在我们调试…

java模式匹配_用Java匹配模式

java模式匹配如果您使用的是Java,那么您很有可能以前已经看过它的模式匹配。 String#matches(String)方法在内部使用Pattern类型,该类型包含更复杂的功能: 通过编译正则表达式来创建Pattern 。 该模式与任何输入字符串匹配,并且可…

java在frame怎么计时_java – 退出jframe时的Swing stop计时器

我有一个特定的任务,我按计划的时间间隔运行.基本上我在JFrame中的Label上显示相机.但是,当我退出JFrame时,应用程序似乎运行.我怎么能阻止它?我已经删除了代码的细节,只是将相关部分留在了public class TaskCLass extends JFrame {JPanel p;JLabel l;Timer timer;p…

java日志——修改日志管理器配置+日志本地化

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 java日志——修改日志管理器配置日志本地化 的相关知识; 【1】修改日志管理器配置 1.1)可以通过编辑配置文件来修改日志系统的各种属性。 在默认情况下&a…

jpa embedded_JPA @Embeddable和@Embedded

jpa embedded介绍: 作为一个面向对象的开发人员,我们希望避免使用带有大量不相关字段的大型类。 因此,我们可能经常感到有必要使用多个对象来表示JPA实体。 在本快速教程中,我们将学习如何使用JPA或Hibernate中的Embedded和Embed…

jdk内置线程实例_EA问题的JDK14实例

jdk内置线程实例Tagir Valeev最近发布了一条有关即将发布的Java JDK14版本的预览功能的推文: #Java14模式匹配将名称隐藏带入了更高的疯狂程度。 在这里,我为FLAG字段添加或删除了final修饰符,该修饰符仅在不可达的if分支中访问。…

intro to Apache Log4j 2

【0】README 0.1)本文作为 原文(http://logging.apache.org/log4j/2.x/)的译文,仅作参考, 旨在了解 Log4j 2 的相关知识 ; 0.2) Apache Log4j 2 是Log4j的升级版,并对其前任Log4j …

php注册页面模板,选项卡式WordPress登陆注册模板

上次说到不用插件也可以修改WordPress登陆注册界面,不过只是简单的修改了CSS,缺少很多元素,例如header、导航、footer等,为了增加这些元素,我们可以采取另一种方式,将WordPress登陆注册界面做成page模板&am…

内核堆栈 用户堆栈_弹性堆栈介绍

内核堆栈 用户堆栈当您运行对公司至关重要的软件时,您将无法拥有仅用于分析一段时间前发生的事情的日志,让客户端告诉您您的应用程序已损坏,而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。 大多数应用…

php 字符串 中文,php 中文字符串截取乱码

PHP截取字符串如果是英文直接用substr就可以了,但对于中文字符,用substring可能会导致乱码,那么将如何解决呢?1、通过函数mb_substr实现说明:mb_substr($str, $start, $length, $encoding);通过该函数即可,但需要加载p…

java 调试技巧

【0】README 0.1) 本文描述源代码均 转自 core java volume 1, 旨在理解 java 调试技巧 的相关知识; 【1】调试技巧相关 1.1)可以用下面的方法打印或记录任意变量的值: System.out.println("x " x); 或 …

jdk 版本和内部版本对应_JDK 14 Rampdown:内部版本27

jdk 版本和内部版本对应马克 雷因霍尔德( Mark Reinhold)最近的帖子“ JDK 14现在处于Rampdown第一阶段 ”宣布“我们现在处于Rampdown第一阶段”,并且“整体功能已冻结”。 JDK 14 Early Access Build #27(2019/12/12…

对一个java源文件进行正确编译,给定如下一个Java源文件Child.java,编译并运行Child.java,以下结果正确的是()...

总成化无本优部问决企题业内法解,给定流配特别题是物送问。而他再告真的不是己这却一诉自,个源文译并运行下某人重病的家得了假如人忽然间,的应对策略有他使用到。结果感是个人自我指一效能对:。哲学的规揭示律一般,管…

异常java.lang.Thread.dumpStack(Unknown Source)

转自: http://www.blogjava.net/landon/archive/2011/02/27/345265.html 昨天在公司写了一段代码,很简单,就是测试Thread的dumpStack方法的使用。 因为Thread的dumpStack方法不是很常用,但它对于如果想看看谁在运行时调用方法还是…

java集合框架——接口图+类图+遗留类图

【0】README 0.1)绝对的干货,理清 java集合框架中类和接口的层次关系;

构建maven项目插件_如何构建一个Maven插件

构建maven项目插件使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 由于其插件生态系统的普及,Apache Maven仍然是Java领域最受欢迎的构建工具。 很容易找到…

shu函数php,【函数分享】每日PHP函数分享(2021-3-3)

array_intersect_assoc — 带索引检查计算数组的交集说明array_intersect_assoc ( array $array1 , array $array2 , array $... ? ) : arrayarray_intersect_assoc() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意和 arra…

spring 注释_Spring@主要注释

spring 注释介绍: 当存在多个相同类型的bean时,使用Spring Primary批注为标记的bean提供更高的优先级。 默认情况下,Spring按类型自动连线。 因此,当Spring尝试自动装配并且有多个相同类型的bean时,我们将得到一个NoU…