大家好,欢迎来到IT知识分享网。
首先老样子,三个方面来理解
分割线
断言是个啥(尝试初步《理解》)
断言(assert):也就是所谓的assertion,是jdk1.4后加入的新功能。
assert为动词,assertion为名词,assert是java关键字,assertion是技术名称
断言 の 定义:
官话: 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。 ——摘自百度百科【断言】
行话: 断言(Assertion)是一种调试程序的方式,断言可以在调试情况当错误排查,用于检查前条件,是我们的代码更加接近”契约式编程”
大白话: 就是为了检测我们程序自己疏忽写出来的bug啦,当断言报错我就知道这里是我写错哒
(一天不报错我就浑身难受).jpg
【说实话满脸懵逼.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 布尔表达式;
assert x >= 0 : "x must >= 0";
这样,断言失败的时候,AssertionError
会带上消息x must >= 0
,更加便于调试。
Java断言的特点是:断言失败时会抛出AssertionError
,导致程序结束退出。因此,断言不能用于可恢复的程序错误,只应该用于开发和测试阶段。
个人的思考理解和总结(说话不负责时间)
断言与if的区别
那问题来了,断言和if有什么区别呢?
黑人问号.jpg
if(种子!=苹果树种子){
return “你要种的是苹果树啊,小傻子” }
assert版本:
assert 种子=苹果树种子
定睛一看感觉没啥区别,都是如果种子不是苹果树的种子就会拉闸。
但是:
我:!!!???
榴莲:怪我喽!!!???.jpg
如果是assert会在我调试debug的时候跳出来说:你似不似个傻子,拿错种子了,能种出来苹果就怪了
但是如果我的if语句写的不够完善却导致程序错误的继续执行下去了
榴莲:我出生了。苹果:那我呢?
assert中的布尔表达式一旦是false便会终止程序抛出异常,并且说这个地方的种子不符合规矩
但if在执行完之后,可能并不会发生报错,而是程序继续运行下去,导致种子这个非法数据被隐藏起来,从而导致了更大的错误却不能准确定位到错误位置,一直等到最后发生了才后悔莫及
(指种出榴莲而非苹果呜呜呜)
这些都是会导致程序不能正常运行的非法情况。使用assert(断言)的目的是捕捉在运行时不应该发生的非法情况。但不要混淆 非法情况 与 错误情况 之间的区别,
前者是程序员不愿意看到的会导致程序不能正常运行的情况;
后者却是程序运行过程中自然存在的并且是一定要主动做出处理的情况;
我:!!!???啊这
榴莲:我能怎么办啊,我也很绝望啊.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 布尔表达式 【: “报错注释”;】
《理解》:
——参考网站
断言的用法:
使用断言 – 廖雪峰的官方网站
新年快乐!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128959.html