Java 中的 断言 (assert)—— 初识 简单的使用和理解~只要这一篇就够了

@

目录
  • 断言是个啥(尝试初步《理解》)
  • 如何使用(到底咋子个用,啥时候用)
  • 个人的思考理解和总结(说话不负责时间)
    • 断言与if的区别
    • 断言和异常的区别
  • 总结
  • 新年快乐!


分割线


断言是个啥(尝试初步《理解》)


断言(assert):也就是所谓的assertion,是jdk1.4后加入的新功能。

assert为动词,assertion为名词,assert是java关键字,assertion是技术名称

断言 の 定义:

官话: 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ——摘自百度百科【断言】

行话: 断言(Assertion)是一种调试程序的方式,断言可以在调试情况当错误排查,用于检查前条件,是我们的代码更加接近"契约式编程"

大白话: 就是为了检测我们程序自己疏忽写出来的bug啦,当断言报错我就知道这里是我写错哒
(一天不报错我就浑身难受).jpg

它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。
当软件正式发布后,可以取消断言部分的代码。java中使用assert作为断言的一个关键字,这就可以看出java对断言还是很重视的,因为如果不是很重要的话,直接开发个类就可以了,没必要新定义一个关键字。

【说实话满脸懵逼.jpg】

读完之后我开始怀疑我的《阅读理解》是不是没有学好了,说了一大堆也没看懂。

废话不多说 直接进入实战吧,学习效率最高的方法是 实践与思考


如何使用(到底咋子个用,啥时候用)


上例子:

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

我们都知道程序在正常执行结束过后应该输出x的绝对值,也就是 正123.45 而此时x必定大于0,不大于零那肯定是哪里出了毛病。 而理所当然如果 x 不大于0 assert也就是断言失败就会发生报错, 抛出AssertionError

也就是说:

assert 布尔表达式;

表达式如果是true程序继续执行,如果是false就会报错告诉你这里错了
使用assert语句时,还可以添加一个可选的断言消息

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

这样,断言失败的时候,AssertionError会带上消息x must >= 0,更加便于调试。
Java断言的特点是:断言失败时会抛出AssertionError,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。


个人的思考理解和总结(说话不负责时间)


看完之后
我:那这么说就是相当于一个判断么,走到这里判断true就继续执行,false就报错呗
脑子:嗯嗯嗯,没毛病.......................................唉,不对啊,那这不和我程序里写个if判断一样么。我还学个锤子断言,直接if就完了。
我:那也不对,要是有了if就行,那为什么还有断言呢


断言与if的区别


那问题来了,断言和if有什么区别呢?
黑人问号.jpg

老办法上例子
假如说我现在在我家的客厅里想要种一棵苹果树,我要保证我的变量 种子 必须为苹果树种子
if版本:

if(种子!=苹果树种子){
    return “你要种的是苹果树啊,小傻子”
}

assert版本:

assert 种子!=苹果树种子

首先要明白assert语句仅仅在debug(调试)版本中才有效
而if(NULL!=x)在relsease(正式)版本中仍旧有效

定睛一看感觉没啥区别,都是如果种子不是苹果树的种子就会拉闸。

但是:

还是我客厅里的苹果树,我这天天浇水施肥,最后有一天花开结果了,却发现不是树上不是苹果
而是榴莲

我:!!!???
榴莲:怪我喽!!!???.jpg

如果是assert会在我调试debug的时候跳出来说:你似不似个傻子,拿错种子了,能种出来苹果就怪了
但是如果我的if语句写的不够完善却导致程序错误的继续执行下去了

榴莲:我出生了。苹果:那我呢?

assert中的布尔表达式一旦是false便会终止程序抛出异常,并且说这个地方的种子不符合规矩

但if在执行完之后,可能并不会发生报错,而是程序继续运行下去,导致种子这个非法数据被隐藏起来,从而导致了更大的错误却不能准确定位到错误位置,一直等到最后发生了才后悔莫及
(指种出榴莲而非苹果呜呜呜)

这些都是会导致程序不能正常运行的非法情况。使用assert(断言)的目的是捕捉在运行时不应该发生的非法情况。但不要混淆 非法情况错误情况 之间的区别,
前者是程序员不愿意看到的会导致程序不能正常运行的情况;
后者却是程序运行过程中自然存在的并且是一定要主动做出处理的情况;

还是我客厅里的苹果树,继上一次的失败之后我吸取的教训,保证是苹果树种子。
万无一失.jpg

我这天天浇水施肥,最后有一天花开结果了,却发现不是树上不是苹果
还是榴莲

我:!!!???啊这
榴莲:我能怎么办啊,我也很绝望啊.jpg

排查阶段:
如果是我一开始种种子的时候一不小心种错了,那这就属于非法情况,是我一开始不小心写出来的逻辑bug,只要我谨慎一点的修改就可以解决的
如果是在我种完了之后种子突然基因突变剧情需要 了,那这就是错误情况

苹果:我不做苹果了,jojo!.jpg 我:???

  • 使用条件语句后:

    • 程序编译后的目标代码体积变大
    • 降低最终发布的程序效率
  • 使用断言:

    • 便于在程序调试时发现错误
    • 不会影响程序执行效率
  • 断言只能用于调试,不能作为程序的功能。

  • 断言可以帮助我们定位错误,而不是排除错误

  • 断言不是用来检查程序的错误的,断言为假只会中断程序的执行,报告程序是错误的,而不会对错误进行相应的处理。

  • 断言不能用来判断有可能发生的情况是否会发生,不能对函数的入口参数进行合法性检查,不能用断言代替条件语句,不能用断言判断有可能发生的错误,只能用于检查程序中不能发生的错误确实不会发生

  • 断言一般用与检查函数参数的合法性(有效性)而不是正确性,但是合法的程序并不见得就是正确的程序。

你应该记住的主要事情是if-else语句应该用于程序流控制,而assert关键字只应该用于测试目的.你永远不应该使用asserts来实际执行你的应用程序所需的任何操作


我说:哦哦哦哦哦,那我懂了,也就说assert是用在调试里的,用来检查,放在这里以防万一,单纯的验证,但if用于条件判断的功能 不能和assert混为一谈,正式版本中还是要使用if语句
脑子说:那也不对啊,断言如果false报错抛出异常,那我自己写个异常配合if抛出去不就完了,我还写个锤子的断言
我说:对哦,我写断言干嘛啊


断言和异常的区别


那问题又来了,断言和异常有什么区别呢?
黑人问号.jpg

老办法,其实还是那棵苹果树
上例子:

assert !(苹果树是否基因突变) : “我基因突变了,哈哈哈”;

如果基因突变为true 也就是基因突变了,加上非就是false,会抛出异常
如果没突变false变成true程序继续运行。

但是这样有具体含义么,除了告诉你到底基因是否突变以外没有任何意义,因为基因突变本身就不是我们程序员(种树的我)能够控制的

就好像

assert 明天下雨

然后抛出了异常,哦,那我知道了明天不下雨,但是我是无法预测下雨本身的,这个时候就应该使用异常了

我:《理解》《懂了》

小结:
assert用在那些你知道绝对不会发生的事情上,但是因为人总是会犯错误,保不准你写出来的东西跟你想的不一样。所以assert用来捕捉的是程序员自己的错误。

同理,exception捕捉的是用户或者环境的错误。


总结


下面有请课代表总结:

断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ——摘自百度百科【断言】

在java中用法为:

// 如果布尔表达式为true则程序继续运行,如果为false则抛出AssertionError终止程序运行
//【】意为选填,可以不填
assert 布尔表达式 【: “报错注释”;】

《理解》:

一,assert其实就是一种用来调试代码的方式,不能作为程序的功能。
assert只能在debug(调试)中使用,而非rerelsease(正式)中

二,assert是用于检查程序中不能发生的错误确实不会发生,
帮助我们定位错误,而不是排除错误,不是用来判断有可能发生的错误。

三,assert不能替代条件语句,只用来保证程序的合法性,但不代表程序正确性。
而if-else语句应该用于程序流控制,而assert关键字只应该用于测试目的.
你永远不应该使用asserts来实际执行你的应用程序所需的任何操作。

四,assert也不可以取代异常
assert用在那些你知道绝对不会发生的事情上,但是因为人总是会犯错误,保不准你写出来的东西跟你想的不一样。所以assert用来捕捉的是程序员自己的错误。
同理,exception捕捉的是用户或者环境的错误。


——参考网站
断言的用法:
使用断言 - 廖雪峰的官方网站

断言和if的区别:
"assert与if的区别(讲个小故事一下就明白了)_ylwdi的专栏-CSDN博客_python assert 和 if 的区别"
"assert与if的区别_Silence723的博客-CSDN博客_断言和if的区别"
"if与assert的区别 - 梅花九弄丶- 简书"

断言和异常的区别:
"什么时候用异常,什么时候用断言? - 知乎"

新年快乐!

能看完我如此啰里啰嗦的博客真是辛苦大家了,对网上的知识进行了个人的总结,也是我个人学习断言时的心路历程,只是进行的最简单的了解,如果想深入了解断言的概念和初衷,可以了解一下
——防御式编程与契约式编程
如有错误请一定指出!!!,谢谢大家的耐心观看,提前在这里祝大家
新年快乐!

你可能感兴趣的:(Java 中的 断言 (assert)—— 初识 简单的使用和理解~只要这一篇就够了)