问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在Java中怎么使用断言

发布网友 发布时间:2022-04-23 10:02

我来回答

1个回答

热心网友 时间:2023-10-10 15:52

如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。

assert关键字语法很简单,有两种用法:

1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。

2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

三、应用实例

下面给出一个例子,通过例子说明其用法:

public class AssertFoo {
public static void main(String args[]) {
//断言1结果为true,则继续往下执行
assert true;
System.out.println("断言1没有问题,Go!");

System.out.println("\n-----------------\n");

//断言2结果为false,程序终止
assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";
System.out.println("断言2没有问题,Go!");
}
}

保存代码到C:\AssertFoo.java,然后按照下面的方式执行,查看控制台输出结果:

1、编译程序:
C:\>javac AssertFoo.java

2、默认执行程序,没有开启-ea开关:
C:\>java AssertFoo
断言1没有问题,Go!

-----------------

断言2没有问题,Go!

3、开启-ea开关,执行程序:
C:\>java -ea AssertFoo
断言1没有问题,Go!

-----------------

Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
会在抛出异常的时候输出!
at AssertFoo.main(AssertFoo.java:10)

四、陷阱

assert关键字用法简单,但是使用assert往往会让你陷入越来越深的陷阱中。应避免使用。笔者经过研究,总结了以下原因:

1、assert关键字需要在运行时候显式开启才能生效,否则你的断言就没有任何意义。而现在主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你如果使用IDE工具编码,调试运行时候会有一定的麻烦。并且,对于Java Web应用,程序代码都是部署在容器里面,你没法直接去控制程序的运行,如果一定要开启-ea的开关,则需要更改Web容器的运行配置参数。这对程序的移植和部署都带来很大的不便。

2、用assert代替if是陷阱之二。assert的判断和if语句差不多,但两者的作用有着本质的区别:assert关键字本意上是为测试调试程序时使用的,但如果不小心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。

3、assert断言失败将面临程序的退出。这在一个生产环境下的应用是绝不能容忍的。一般都是通过异常处理来解决程序中潜在的错误。但是使用断言就很危险,一旦失败系统就挂了。

五、对assert的思考

assert既然是为了调试测试程序用,不在正式生产环境下用,那应该考虑更好的测试JUint来代替其做用,JUint相对assert关键的所提供的功能是有过之而无不及。当然完全可以通过IDE debug来进行调试测试。在此看来,assert的前途一片昏暗。

因此,应当避免在Java中使用assert关键字,除非哪一天Java默认支持开启-ea的开关,这时候可以考虑。对比一下,assert能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

以上仅仅代表我个人观点,欢迎大家留言讨论。

-----------------------------------------------------------------------------------
下面是一些Assert的例子:
assert 0 < value;
assert 0 < value:"value="+value;
assert ref != null:"ref doesn''t equal null";
assert isBalanced();

-----------------------------------------------------------------------------------
AssertinError类是Error的直接子类,因此代表程序出现了严重的错误,这种异常通常是不需要程序员使用catch语句捕捉的。

使用assert的准则:assert语句的作用是保证程序内部的一致性,而不是用户与程序之间的一致性,所以不应用在保证命令行参数的正确性。可以用来保证传递给private方法参数的正确性。因为私有方法只是在类的内部被调用,因而是程序员可以控制的,我们可以预期它的状态是正确和一致的。公有方法则不适用。此外,assert语句可用于检查任何方法结束时状态的正确性,及在方法的开始检查相关的初始状态 等等。

assert语句并不构成程序正常运行逻辑的一部分,时刻记住在运行时它们可能不会被执行。

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

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

-----------------------------------------------------------------------------------
不要再public的方法里面检查参数是不是为null之类的操作,例如:
public int get(String s){
assert s != null;
}

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

不要用assert来检查方法操作的返回值来判断方法操作的结果,例如:
assert list.removeAll();这样看起来好像没有问题 但是想想如果assert 被disable呢,那样他就不会被执行了,所以removeAll()操作就没有被执行,可以这样代替
boolean boo = list.removeAl();
assert boo;

-----------------------------------------------------------------------------------
另外,Java为了让程序也能够动态开启和关闭某些类和包的assertion功能,Java修该了Class和ClassLoader的实现,增加了几个用于操作assert的API。下面简单说明一下几个API的作用。
ClassLoader类中的几个相关的API:
  setDefaultAssertionStatus:用于开启/关闭assertion功能
  setPackageAssertionStatus:用于开启/关闭某些包的assertion功能
  setClassAssertionStatus: 用于开启/关闭某些类的assertion功能
  clearAssertionStatus:用于关闭assertion功能
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 深圳世纪琥珀博物馆附近有什么好吃的? 请问下清远哪里有可以拍摄个人古装写真的照相馆? 成都市内公园观菊花最好的地方是哪个公园? java中assert什么意思? 清远市阳山县私人有狗卖 北大资源·阅城周边环境怎么样?生活便利吗? Java中断言的用法 清远温泉哪里有私家的?路线?金额 JAVA断言机制作用,如何使用 城市绿道的具体功能有哪些? 在拼多多上面卖东西打字说淘宝会有什么后果? 请问清远哪里有私人人流的呢? 程序设计里面的断言是什么???Java里面的assert,assert.h又是什么??? 拼多多客服发了淘宝链接给买家,会被处罚吗? 东莞市这边哪个公园有个石头上写着问道两个字 关于私人楼房是否可以办理房产证问题?(清远市) 高级Java断言的用途? 您好,天津市绿道公园的具体位置在哪 谢谢您 清远私人集资房可以不动产登记吗 拼多多盗图,联系拼多多客服投诉,可是客服一直说要等,就是不处理,这个要... 请问有哪位朋友知道清远哪里有人养罗威纳犬吗?就是有幼犬出卖的那种!最好是私人家养的! java中断言assert什么意思? 事发南充,上游电站泄洪3人散步被冲走,当地采取了哪些举措? 我是清远户口,想以个人名义购买社保,是怎样买的?交多少钱?买几多? java中,断言可以用于检查传递给私有方法的参数,怎么理解这句话 武汉有哪些适合户外烧烤的地方_景点 清远黄坑好美家附近是否有一位姓谭的私人趁所,附近有制衣厂的,听说医癌症很了得的, 离武汉商学院最近的公园 清远市第一富豪是谁, assert的java断言 公园绿道全长600米如果有它的一侧从头到尾每隔50米安放一个垃圾桶共需要多少? 现在要去广东清远上班,可以开私家车吗? Java开发中什么时候使用断言? 北大资源·阅城怎么样?好不好?值不值得买? 清远个人社保缴费查询 java的断言应该在什么情况下用? 清远个人贷款条件?是不是真的呀 Java assert 断言 清远开始实行个人可以购买公积金吗? 在实际java开发中什么时候用assert