java 断言 assert 详解:断言开启、断言使用

2023-11-06

一、背景

1、java断言Assert是jdk1.4引入的。
2、jvm 断言默认是关闭的。
3、断言只适用于复杂的调试过程。
4、断言一般用于程序执行结果的判断,千万不要让断言处理业务流程。

二、如何判断是否开启了断言

public class AssertTest {

public static void main(String[] args) {
boolean isOpen = false;
assert isOpen=true; //如果开启了断言,会将isOpen的值改为true
System.out.println(isOpen);//打印是否开启了断言
}
}

执行上面代码,如果打印 true说明已经启用了断言,如果为 false 则没有启用断言。
如果没有启用断言,则按按照下面第三步的方法开启断言。

三、开启断言

选择菜单:Run —> Run Configurations…—> 选择 Arguments 选项卡
在 VM arguments 文本框中输入: -ea
注意:中间没有空格,如果输入 -da 表示禁止断言。
然后关闭该窗口,然后保存就开启了断言

四、断言的使用

assert关键字语法很简单,有两种用法:

方法一、assert <boolean表达式>

如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。

方法二、assert <boolean表达式> : <错误信息表达式>

如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

五、Assert使用之陷阱

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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 断言 assert 详解:断言开启、断言使用 的相关文章

  • JavaMail Gmail 问题。 “准备启动 TLS”然后失败

    mailServerProperties System getProperties mailServerProperties put mail smtp port 587 mailServerProperties put mail smtp
  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • HJ2 计算某字符出现次数

    知识点字符串哈希 描述 写出一个程序 接受一个由字母 数字和空格组成的字符串 和一个字符 然后输出输入字符串中该字符的出现次数 不区分大小写字母 数据范围 1 n 1000 输入描述 第一行输入一个由字母和数字以及空格组成的字符串 第二行输
  • 设计模式梳理——访问者模式

    一 概述 访问者模式 Visitor 表示一个作用于某对象结构中的各元素的操作 它使你可以在不改变个元素的类的前提下作用于这些元素的新操作 二 UML图示 三 代码实现 我们都知道财务都是有账本的 这个账本就可以作为一个对象结构 而它其中的
  • springsecurity 提示:There is no PasswordEncoder mapped for the id "null"

    用户角色权限系统 springboot springsecurity mysql 提示如下错误信息 java lang IllegalArgumentException There is no PasswordEncoder mapped
  • 虚函数的原理

    引用 windows程序员面试指南 虚函数 虚函数通过虚函数表管理 特点 1 虚函数表属于类 类的所有对象共享这个类的虚函数表 2 虚函数指针属于对象 在每个对象内部的开头 指向同一虚函数表 继承特点 只继承一个父类无覆盖时 父类虚函数在子
  • 在64位电脑上 使用anaconda虚拟环境将Python程序打包成32位

    之前写啦一些打包博文 见链接 anaconda虚拟环境教程大全 使用pipenv建立虚拟环境解决python打包exe文件过大的问题 附打包带图标 多个py文件打包exe cmd执行python程序 文件夹直接进入cmd程序 python将
  • VirtualBox网络之桥接网卡

    如下图所示 VirtualBox支持的网络模式有多种 桥接网卡不同与其它的几种 首先体现在名字上 其它模式都带有 网络 字眼 说明当前的网卡需要接入一个由用户创建的网络 而桥接网卡则只是网卡 这种模式不需要创建网络 从效果上看 这种网卡与宿
  • Linux 下使用命令行查看PDF

    使用 evince命令查看 evince frames pdf
  • 低通、高通、带通、阻通滤波器

    目录 低通 高通 带通 阻通滤波器 低通 高通 带通 带阻滤波器的区别 通俗理解 1 低通滤波器 2 高通滤波器 3 带通滤波器 4 带阻滤波器 5 全通滤波器 低通 高通 带通 阻通滤波器 低通 高通 带通 带阻滤波器的区别 低通滤波器
  • STM32系列(HAL库)——F103C8T6通过NRF24L01(2.4G)无线模块进行双机通信

    本文参考 STM32L051C8T6 HAL库 nRF24L01 收发案例 硬件SPI通讯 1 软件准备 1 编程平台 Keil5 2 CubeMX 3 XCOM 串口调试助手 2 硬件准备 2套 1 F1的板子 本例使用经典F103C8T
  • ROS开发日记(1)——ROS基础知识

    ROS 即开源机器人操作系统 1 官方定义 ROS是面向机器人的开源的元操作系统 meta operating system 1 它能够提供类似传统操作系统的诸多功能 如硬件抽象 底层设备控制 常用功能实现 进程间消息传递和程序包管理等 此
  • java实现信息的增删改查功能的网页设计(1)

    仅供参考 不可转载 如遇其他情况概不负责 后果自负 切记 该项目运用的技术 spring springMVC ibatis 本网页只有一个页面 包过信息的增 删 改 查功能 只有部分代码 仅供参考 因该项目比较大 所以仅提供了一个页面内的增
  • 命名时取代基优先顺序_有机物命名:常见官能团的优先次序表

    一 官能团的优先次序 常见官能团的优先次序表类别序号官能团词头名称词尾名称 酸1 COOH羧基羧酸 2 SO3H磺基磺酸 羧 酸 衍 生 物3 COOR酯基羧酸酯 4 COX卤羰基酰卤 5 CONH2氨甲 酰基酰胺 腈6 CN氰基腈 醛7
  • MySQL——JDBC

    文章目录 1 数据库驱动 2 JDBC 3 第一个JDBC程序 4 步骤总结 5 JDBC对象解释 6 写工具类 7 JDBC操作事务 7 1 创建表 7 2 事务 7 3 总结 8 数据库连接池 8 1 DBCP 8 2 c3p0 1 数
  • 从游戏脚本语言说起,剖析Mono所搭建的脚本基础

    从游戏脚本语言说起 剖析Mono所搭建的脚本基础 0x00 前言 在日常的工作中 我偶尔能遇到这样的问题 为何游戏脚本在现在的游戏开发中变得不可或缺 那么这周我就写篇文章从游戏脚本聊起 分析一下游戏脚本因何出现 而mono又能提供怎样的脚本
  • 系统开发(上)-软件设计(三十二)

    信息系统安全 对称加密 软件设计 三十一 https blog csdn net ke1ying article details 129678350 瀑布模型SDLC 是结构化的开发 步奏 软件计划 gt 需求分析 gt 软件设计 gt 程
  • 【信号去噪】基于变分贝叶斯卡尔曼滤波器实现信号去噪附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Java使用get请求接收List集合数据(json)并导出报表

    Java使用get请求接收List集合数据 json 并导出报表 文章目录 Java使用get请求接收List集合数据 json 并导出报表 前言 一 实现分析 二 Maven依赖 基于EasyExcel实现 三 后台代码 四 使用Post
  • 深度学习(4):基于深层卷积网络实现车牌识别

    目的 基于深层卷积神经网络结合CTC损失函数对车牌进行识别 通过对车牌数据集进行训练获得识别模型 并验证模型性能和将模型进行应用 一 原理 了解深层卷积神经网络构建方法和基本原理 熟悉目标识别相关算法的常规训练流程 掌握CTC损失函数的基本
  • 【工具分享】配置淘宝镜像

    配置淘宝镜像 淘宝镜像地址 https registry npmmirror com 命令行配置 npm config set registry https registry npmmirror com 使用 nrm 配置 使用 npm 全
  • java 断言 assert 详解:断言开启、断言使用

    java中的断言Assert的使用 一 背景 二 如何判断是否开启了断言 三 开启断言 四 断言的使用 方法一 assert