理解和正确使用Java中的断言(assert)

理解和正确使用Java中的断言(assert)随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)一、语法形式:Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:1、assertcondition;这…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

理解和正确使用Java中的断言(assert)

该文转自:http://blog.csdn.net/AbnerChai/article/details/87379

一、语法形式:
    Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的
语法形式有如下所示的两种形式:
1、assert condition;
    这里condition是一个必须为真(true)的表达式。如果表达式的结果为true,那么断言为真,并且无任何行动
如果表达式为false,则断言失败,则会抛出一个AssertionError对象。这个AssertionError继承于Error对象,
而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误。
2、asser condition:expr;
    这里condition是和上面一样的,这个冒号后跟的是一个表达式,通常用于断言失败后的提示信息,说白了,它是一个传到AssertionError构造函数的值,如果断言失败,该值被转化为它对应的字符串,并显示出来。

二、使用示例:
    下面是一个使用assert的例子:

public class TestAssert{

     public static void main(String[] args){

         String name = “abner chai”;
         //String name = null;
         assert (name!=null):”变量name为空null”;
         System.out.println(name);
     }
}

    上面程序中,当变量name为null时,将会抛出一个AssertionError,并输出错误信息。
要想让上面的程序中的断言有效并且正确编译,在编译程序时,必须使用-source 1.4选项。如:

javac -source 1.4 TestAssert.java

在Eclipse(3.0M9)开发环境中,必须在window->preferences 中,左边选中”Java->Compiler”,右边选择
“Compliance and ClassFiles”页面下的将”Compiler Compliance Level”选择为1.4;同时,将
“Use Default Compiler Settings”前的勾去掉。并将下面的
“Generated .class file compatibility”和”Source compatibility”均选择为1.4,才能正确编译。

同时,要想让断言起效用,即让断言语句在运行时确实检查,在运行含有assert的程序时,必须指定-ea选项
如:为了能够让上面的程序运行,我们执行下面代码:

java -ea TestAssert

在在Eclipse(3.0M9)开发环境中,运行时,我们必须配置运行时的选项”Run”,在Arguments页面中的
“VM Arguments” 中填入-ea选项。才能让断言在运行时起作用。

三、注意事项:
    理解断言最重要的一点是必须不依赖它们完成任何程序实际所需的行为。理由是正常发布的代码都是断言无效的,即正常发布的代码中断言语句都不不执行的(或不起作用的),如果一不小心,我们可以错误地使用断言,如:

public class TestPerson{

    private String name = null;
    public TestPerson(String name){

        this.name = name;
    }
    public void setName(String nameStr){

        this.name = nameStr;
    }
    public String getName(){

         return this.name;
    }
    public static void main(String[] args){

        TestPerson personObj = new TestPerson(“Abner Chai”);
        String personName = null;
        assert (personName=personObj.getName())!=null;
        System.out.println(personName.length());
    }
}

这个程序中,对personName的赋值被转移到assert6语句中,尽管断言有效时它可以很好地运行(即使用-ea运行
时可以有效地运行)但如果断言失效,则它会运行时报空指针错误。因为断言无效时,
personName=personObj.getName()一句永远不会执行!
    断言对Java来说是一个好的条件,因为它们使开发过程中错误类型检查流线化,例如,在没有assert之前,
上面的程序要想确认personName 不空,则必须:

if(personName!=null){

    System.out.println(personName.length());
}
才行。有了assert后,使用assert,只需一行代码,并且不必从发布的代码中删除assert语句。
于是,上面的那个程序,经改正后,我们可以这么样来正确的使用assert,如下:

public class TestPerson{

    private String name = null;
    public TestPerson(String name){

        this.name = name;
    }
    public void setName(String nameStr){

        this.name = nameStr;
    }
    public String getName(){

         return this.name;
    }
    public static void main(String[] args){

        TestPerson personObj = new TestPerson(“Abner Chai”);
        String personName = null;
        personName=personObj.getName();
        assert personName!=null;
        System.out.println(personName.length());
    }
}

四、其它选项:
    当执行代码时,使用-ea选项使断言有效,也可以使用-da选项使断言无效(默认为无效)
同样,也可以通过在-ea或-da后面指定包名来使一个包的断言有效或无效。例如,要使一个com.test包中的断言
无效,可以使用:
-da:com.test
要使一个包中的所有子包中的断言能够有效或无效,在包名后加上三个点。例如:
-ea:com.test…

即可使com.test包及其子包中的断言无效。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160101.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python 安装第三方模块

    python 安装第三方模块

    2021年7月1日
    76
  • Spring加载resource时classpath*:与classpath:的区别

    Spring加载resource时classpath*:与classpath:的区别Spring 可以通过指定 classpath 与 classpath 前缀加路径的方式从 classpath 加载文件 如 bean 的定义文件 classpath 的出现是为了从多个 jar 文件中加载相同的文件 classpath 只能加载找到的第一个文件 比如 resource1 jar 中的 package com test rs 有一个 jarAppcontex xml 文件 内容如下

    2025年5月21日
    3
  • 我的世界虚拟人生下载_我的世界虚拟人生手机版

    我的世界虚拟人生下载_我的世界虚拟人生手机版以下就是小编我为大家准备的一些资料,希望对大家有所帮助,我的世界虚拟人生mod可以让游戏中的村庄和村民变得像电脑游戏模拟人生那样,玩家可以在村庄里进行各种与现实生活类似的活动,并且还可以与村民进行更为复杂的互动,比如结婚生子、聊天交易等等。并且村民的外观也会变得更加生动,不再是原来的发出怪声的大鼻子村民了。虚拟人生mod玩法介绍:1、村民互动互动的选项有很多,但是不一定每个都成功。聊天、开玩笑、给…

    2025年5月25日
    0
  • springboot安装ssl证书_一个ssl证书可以多个服务器用吗

    springboot安装ssl证书_一个ssl证书可以多个服务器用吗最近参与了一个微信小程序的项目,API要求服务器域名是Https的,所以研究了一下ssl证书在SpringBoot中的配置首先,到云服务提供商申请一套SSL证书,这里就不提供具体的申请流程了申请到证书之后下载证书现在Tomcat的进行下载,下载解压后有两个文件分别是.pfx后缀和.txt后缀的打开我们的项目(这里就不演示如何构建自己的基于SpringBoot的项目了)将.pfx…

    2022年9月27日
    0
  • 语音_波束形成

    语音_波束形成博客目的:构架语音波束形成的知识体系和资料汇总1.基本概念1.1全向(omnidirectional)与指向(sensitivity)的概念理想的全向麦克理想的指向麦克tips:全指向咪头and单指向咪头全指向咪头的特点:收…

    2022年6月16日
    32
  • python后端框架有哪些_后端框架有哪些?五款优秀的web开源后端框架推荐

    python后端框架有哪些_后端框架有哪些?五款优秀的web开源后端框架推荐作为一个web开发人员,下面五款优秀的开源框架一定要了解一下。PHP篇作为全球最好的web开发编程语言,PHP的框架非常多。下面重点介绍2款:Laravelhttps://laravel.comLaravel最大的优势就是:简洁和优雅。能迅速的让大家从杂乱无章的代码中解脱出来。拥抱PHP7基于composer全栈型框架灵活的路由配置仅仅通过配置文件就可以切换缓存、会话的存储介质,包括(file、r…

    2022年6月8日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号