Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • Java入门基础

    • 计算机常识

    • Java语言概述

    • 基本语法

    • 数组

    • 面向对象

    • 异常处理

      • 异常处理
      • assert断言
    • Java核心基础

    • 设计模式

    • Web开发

    • SpringBoot

    • 微服务

    • Elasticsearch

    • 运维

    • 后端
    • Java入门基础
    • 异常处理
    SaulJWu
    2021-01-09

    assert断言

    断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。

    我们先看一个例子:

    public static void main(String[] args) {
        double x = Math.abs(-123.45);
        assert x >= 0;
        System.out.println(x);
    }
    
    1
    2
    3
    4
    5

    语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError。

    使用assert语句时,还可以添加一个可选的断言消息:

    assert x >= 0 : "x must >= 0";
    
    1

    这样,断言失败的时候,AssertionError会带上消息x must >= 0,更加便于调试。

    Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。

    对于可恢复的程序错误,不应该使用断言。例如:

    void sort(int[] arr) {
        assert arr != null;
    }
    
    1
    2
    3

    应该抛出异常并在上层捕获:

    void sort(int[] arr) {
        if (x == null) {
            throw new IllegalArgumentException("array cannot be null");
        }
    }
    
    1
    2
    3
    4
    5

    当我们在程序中使用assert时,例如,一个简单的断言:

    public class Main {
        public static void main(String[] args) {
            int x = -1;
            assert x > 0;
            System.out.println(x);
        }
    }
    
    1
    2
    3
    4
    5
    6
    7

    运行结果:

    -1
    
    1

    断言x必须大于0,实际上x为-1,断言肯定失败。执行上述代码,发现程序并未抛出AssertionError,而是正常打印了x的值。

    这是怎么肥四?为什么assert语句不起作用?

    这是因为JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。

    要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。所以,上述程序必须在命令行下运行才有效果:

    $ java -ea Main.java
    Exception in thread "main" java.lang.AssertionError
    	at Main.main(Main.java:5)
    
    1
    2
    3

    还可以有选择地对特定地类启用断言,命令行参数是:-ea:com.itranswarp.sample.Main,表示只对com.itranswarp.sample.Main这个类启用断言。

    或者对特定地包启用断言,命令行参数是:-ea:com.itranswarp.sample...(注意结尾有3个.),表示对com.itranswarp.sample这个包启动断言。

    实际开发中,很少使用断言。更好的方法是编写单元测试,后续我们会讲解JUnit的使用。

    # 小结

    • 断言是一种调试方式,断言失败会抛出AssertionError,只能在开发和测试阶段启用断言;

    • 对可恢复的错误不能使用断言,而应该抛出异常;

    • 断言很少被使用,更好的方法是编写单元测试。

    帮我改善此页面 (opens new window)
    #assert#断言
    上次更新: 2021/01/09, 11:11:31
    异常处理
    基本概念

    ← 异常处理 基本概念→

    最近更新
    01
    zabbix学习笔记二
    02-28
    02
    zabbix学习笔记一
    02-10
    03
    Linux访问不了github
    12-08
    更多文章>
    Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式