Java断言详解

概念

断言使用的两种形式:

  • assert condition;

  • assert condition: expression;

    如果条件判断为true,程序继续执行。如果条件判断为false,则抛出 AssertionError异常。在第二个语句中表达式中将传入 AssertionError 对象的构造器,并转换成一个消息字符串。

    “表达式”(expression)部分的唯一目的是产生一个消息字符串。

    AssertionError对象并不存储具体的表达式值(条件并不会自动地生成为错误报告中的一部分),因此以后无法得到这个表达式值。(如果使用表达式的值,就会鼓励程序员尝试从断言失败中恢复程序的运行,这不符合断言机制的初衷。)

断言机制允许在测试期间向代码插入一些检查,而在生产代码中会自动删除这些检查。

启用和禁用

在默认情况下,断言是禁用的。可以在运行程序是用 -enableassertions-ea选项启用断言:

java -enableassertions MyApp

需要注意的是,不必从新编译程序来启用或禁用断言。启用或禁用断言是**类加载器(class loader)**的功能。禁用断言时,类加载器会除去断言代码,因此,不会降低程序的运行速度。

可以在某个类或整个包中启用断言,例如:

java -ea:MyClass -ea:com.mycompany.mylib MyApp

这条命令将为 MyClass类以及 com.mycompany.mylib包和它的子包中的所有类打开断言。选项 -ea 将打开无名包中所有类的断言。

可以使用 disableassertions-da 在特定类和包中禁用断言:

java -ea:... -da:MyClass MyApp

有些类不是由类加载器加载,而是直接由虚拟机加载的。可以使用这些开关有选择地启用或禁用那些类中的断言。

不过,启用和禁用所有断言的 -ea-da 开关不能应用到那些没有类加载器的“系统类”上。对于这些系统类,需要使用-enablesystemassertions/-esa 开关启用断言。

也可以通过编程控制类加载器的断言状态。

使用断言完成参数检查

在Java语言中,给出了3中处理系统错误的机制:

  • 抛出一个异常。
  • 日志。
  • 使用断言。

什么时候应该使用断言呢?请记住下面几点:

  • 断言失败是致命的、不可恢复的错误。
  • 断言检查只是在开发和测试阶段打开(这种做法有时候被戏称为“在靠近海岸时穿上救生衣,但在海里就把救生衣抛掉”)。

因此,不应该使用断言向程序的其他部分通知发生了可恢复性的错误,或者,不应该利用断言与程序用户沟通问题。断言只应该用于测试阶段确定内部错误的位置。

在方法的开头使用断言判断方法的参数是否合法。计算机科学家将这种约定称为前置条件。如果调用者在调用这个方法时没有满足这个前置条件,断言会失败。

使用断言提供假设文档

断言是一种测试和调试阶段使用的战术性工具;日志是一种在程序整个生命周期都可使用的战略性工具。

java.lang.ClassLoader
    * void setDefaultAssertionStatus(boolean b)
    为通过类加载器加载的类(没有显示的类或包断言状态)启用或禁用断言
    * void setClassAssertionStatus(String className,boolean b)
    为给定的类和它的内部类启用或禁用断言
    * void setPackageAssertionStatus(Strng packageName,boolean b)
    为给定的包及其子包中的所有类启用或禁用断言
    * void clearAssertionStatus()
    删除所有显示的类和包的断言状态设置,并禁用通过这个类加载器加载的所有类的断言

Java中的断言assert的用法

断言(assert)的使用

错误: 编码 GBK 的不可映射字符 (0x80)

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值