JAVA从入门到精通-基础之断言细谈
孔庆琦 2018-04-01 来源 : 阅读 1614 评论 0

摘要:JAVA从入门到精通要学习很多,断言是JDK1.4中引入的一个新的关键字,是一种错误处理机制,是在程序的开发和测试阶段使用的工具。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;(程序员认为这个状态是true。)如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告并且退出。理解这个对我们今后的JAVA从入门到精通有很大帮助。

断言是JDK1.4中引入的一个新的关键字,是一种错误处理机制,是在程序的开发和测试阶段使用的工具。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;(程序员认为这个状态是true。)如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告并且退出。

assertion检查有助于增强代码的健壮性,比如如果在程序中出现了某种错误,可以更方便地调试程序。这样做要比程序在某处执行失败造成不良后果来发现错误要好得多。当知道程序失败是由于它违反了假设而引起的时候,跟踪失败的原因要简单得多。要记住断言是用来对那些不应该出现的情况进行实际的“健全性检查”,因此不应该使用它们来替代常规的错误检查。

一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。通常,在整个开发阶段都会启用断言。一旦完全测试了系统并将它移送到产品环境时,则希望禁用断言,因为这样做会略微改善性能。使用assert,只需一行代码,并且不必从发布的代码中删除assert语句。不管怎样,为了编制文档的目的,断言也应保留在代码中。这样,当以后更改代码时,会提醒程序员要保持所有假设都是有效的,并且这也是可测试的。

记住两点:

1. 断言失败是致命的、不可恢复的错误。

2. 断言检查仅仅用在程序开发和测试阶段。

因此,断言仅仅应该在测试阶段用来定位程序内部错误。

(一) 使用方式

断言可以有两种形式

1.assert Expression1

2.assert Expression1:Expression2

其中Expression1是一个布尔表达式,Expression2可以是任何对象或原始类型(包括null)。

在运行时,如果关闭了assertion功能,这些语句将不起任何作用。如果打开了assertion功能,那么expression1的值将被计算,如果它的值为false,该语句强抛出一个AssertionError对象。如果assertion语句包括expression2参数,程序将计算出expression2的结果,然后将这个结果作为AssertionError的构造函数的参数,来创建AssertionError对象,并抛出该对象,expression2可以在发生断言失败时获得更多的细节信息。如果expression1值为true,expression2将不被计算。AssertionError继承于Error对象,而Error继承于Throwable,Error是和Exception并列的一个错误对象,通常用于表达系统级运行错误,也就是说是一个不可控制异常(unchecked Exception)。AssertionError由于是错误,所以可以不捕获,但不推荐这样做,因为那样会使你的系统进入不稳定状态。

注意:(1)一种特殊情况是,如果在计算表达式时,表达式本身抛出Exception,那么assert将停止运行,而抛出这个Exception。

(2)AssertionError对象并不存储表达式Expression2的值,因此你不可能在以后获取它。

例如,如果要进行如下的计算时:

? double y=Math.sqrt(x);

sqrt(x)是一个开平方运算,x必须为正才不会出错。为了检查传入的参数是否为正,可以使用如下的断言语句:

? assert x>=0;
? double y=Math.sqrt(x);

或者

assert x>=0:“ x>=0”;//将“ x>=0”传给AssertionError对象,从而可在出错时显示出来
double y=Math.sqrt(x);

当x为负值时, assert语句将抛出AssertionError异常,你就可以根据异常信息对程序的其它部分进行检查。

(二)编译运行

(1)在编译时必须使用-source 1.4选项,-source 1.4表示使用JDK 1.4版本的方式来编译源代码,否则编译就不能通过,因为缺省的Javac编译器使用JDK1.3的语法规则。

例如:

javac -source 1.4 Myclass.class

(2)在使用断言以前,你需要先开启断言功能,因为Java Runtime Environment(JRE)默认关闭断言功能。在运行时启用用户类的断言需要使用 -ea参数 。要在系统类(不通过类装载器而由JVM直接装载的类)中启用和禁用断言可以使用 -esa 和 -dsa参数。打开或者关闭断言是类装载器的功能。当断言功能被关闭时,类装载器会跳过那些和断言相关的代码,因此不会降低程序运行速度,即它们没有任何副作用。

例如:java –ea

oo.bar... -da

oo.bar.old Myclass

意思是开启对于包foo.bar和其子包的断言,包foo.bar.old除外。

1. 参数 -esa 和 -dsa:

它们含义为开启(关闭)系统类的assertion功能。由于新版本的Java的系统类中,也使了assertion语句,因此如果用户需要观察它们的运行情况,就需要打开系统类的assertion功能,我们可使用-esa参数打开,使用 -dsa参数关闭。

-esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名有同样的功能。

2. 参数 -ea和-da:

它们含义为开启(关闭)用户类的assertion功能:通过这个参数,用户可以打开某些类或包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,表示打开这些类或包;如果包名称后面跟有三个点,代表这个包及其子包;如果只有三个点,代表无名包。关闭assertion功能参数为-da,使用方法与-ea类似。-ea和-da的全名为-enableassertions和-disenableassertions,全名和缩写名有同样的功能。

(三)如何检测断言是否被开启的程序。Sun提供了这个小技巧:

static {
boolean assertsEnabled = false;
// here's the trick
assert assertsEnabled = true;
if( !assertsEnabled )
throw new RuntimeException(
"Asserts must be enabled!");
}

你可以在任何使用断言的代码中加入这个代码块。如果断言功能被关闭,那assert不会被执行,异常会被抛出。用次代码块保证断言开启

(四)警告:

Assert最好不要滥用,原因是assert并不一定都是enable的,断言语句不是永远会执行,可以屏蔽也可以启用

(1)不要让断言语句更改代码中的状态/值。否则当最终关闭断言时,代码的行为方式将不同于启用断言时代码的行为。也就是说,不要使用断言语句去修改变量和改变方法的返回值

例如,不要创建如下的断言:

assert (++i > 10); // BAD: i changes only with assertions enabled!

(2)不要再public的方法里面检查参数是不是为null之类的操作,也就是说不要使用断言作为公共方法的参数检查,因为公共方法的参数永远都要执行,这样就不能将assert设置为enable了

例如

public int get(String s)
{
assert s != null;
}

假如需要检查也最好通过if s = null 抛出NullPointerException来检查

(3)一般来说,动作(actions)(方法、操作等)不应该被作为assert的第一个参数所使用,除非有特别的需要,因为它们可能不会被执行。

可以简言之:不要用assert来检查方法操作的返回值来判定方法操作的结果

希望这篇文章可以帮助到你,总之同学们,it资讯尽在职坐标。

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

对MVC模式和三层架构有深入的研究

  • 10
    文章
  • 6074
    人气
  • 92%
    受欢迎度

已有24人表明态度,92%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 索取资料 索取资料 索取资料
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
JAVA从入门到精通-CoreJava读书笔记--对象与类(一)
经验技巧 100% 的用户喜欢
JAVA从入门到精通-垃圾回收机制 以及它的触发
经验技巧 100% 的用户喜欢
JAVA语言-代码块,静态代码块,内部类,静态内部类的加载时机
经验技巧 67% 的用户喜欢
JAVA语言-多线程实现的四种方式
经验技巧 100% 的用户喜欢
JAVA语言-AVA文件流
经验技巧 100% 的用户喜欢
其他海同师资 更多>>
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
周鸣君
周鸣君 联系TA
擅长Hadoop/Spark大数据技术
范佺菁
范佺菁 联系TA
擅长Java语言,只有合理的安排和管理时间你才能做得更多,行得更远!
金延鑫
金延鑫 联系TA
擅长与学生或家长及时有效沟通
程光淼
程光淼 联系TA
精通C、C++等语言、智能芯片开发
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程