Java学习:assert(断言)的使用——测试程序和AssertionError错误事件

Java学习:assert(断言)的使用——测试程序和AssertionError错误事件assert是在J2SE1.4中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在1.4中添加了assert关键字


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

assert 是在 J2SE1.4 中引入的新特性, assertion 就是在代码中包括的布尔型状态,程序员认为这个状态是 true 。一般来说 assert 在开发的时候是检查程序的安全性的,在发布的时候通常都不使用 assert 。在 1.4 中添加了 assert 关键字和 java.lang.AssertError 类的支持。
      首先,我们有必要从一个例子说起 assert

public class AssertTest 
{ 
 public static void main(String[] args) 
 { 
  AssertTest at = new AssertTest(); 
  at.assertMe(true); 
  at.assertMe(false); 
   
 } 
  
 private  void assertMe(boolean boo) 
 { 
  assert boo?true:false; 
  System.out.println("true condition"); 
 } 
  
} 

程序中包含了 assert 的话,你要用 javac -source 1.4 xxx.java 来编译,否则编译器会报错的。要想让 assert 得部分运行的话,要使用 java -ea xxx 来运行,否则包含 assert 得行会被忽略。下面我们运行
javac -source 1.4 AssertTest.java
java -ea AssertTest
看看结果的输出是:
true condition
Exception in thread main java.lang.AssertionError
        at AssertTest.assertMe(AssertTest.java:13)
        at AssertTest.main(AssertTest.java:7)
当我们运行 at.assertMe(true) 得时候,由于 assert boo?true:false 相当于 assert true; 因此没有任何问题,程序往下执行打印出 true condition ,但是执行 at.assertMe(false) 的时候相当于 assert false ,这个时候解释器就会抛出 AssertionError 了,程序就终止了。大家必须清楚 AssertionError 是继承自 Error 得,因此你可以不再程序中 catch 它的,当然你也可以在程序中 catch 它然后程序可以继续执行。例如:

public class AssertTest 
{ 
 public static void main(String[] args) 
 { 
  AssertTest at = new AssertTest(); 
  try 
  { 
   at.assertMe(true); 
   at.assertMe(false); 
  } 
  catch(AssertionError ae) 
  { 
   System.out.println("AsseriontError catched"); 
  } 
  System.out.println("go on"); 
   
 } 
  
 private  void assertMe(boolean boo) 
 { 
  assert boo?true:false; 
  System.out.println("true condition"); 
 } 
  
} 

    assert 还有另外一种表达的方式,就是 assert exp1:exp2; 其中 exp1 是个 boolean 返回值得表达式,而 exp2 可以是原始的数据类型或者对象都可以例如:
   boolean boo = true;
   String str = null;
    assert boo == false :str=”error”;
我们刚开始讲得 assert exp1 得形式,当 exp1 是 false 得时候, AssertionError 得默认构造器会被调用,但是 assert exp1:exp2 这样的形式,当 exp1 为 true 的时候后面 exp2 被或略,如果 false 的话,后面的表达式的结果会被计算出来并作为 AssertionError 得构造器参数。看下面的例子:

public class AssertTest 
{ 
 public static void main(String[] args) 
 { 
  AssertTest at = new AssertTest(); 
  at.assertMe(true); 
  at.assertMe(false); 
   
 } 
  
 private  void assertMe(boolean boo) 
 { 
  String s = null; 
  assert boo?true:false:s = "hello world"; 
  System.out.println("true condition"); 
 } 
  
} 

运行的时候会得到这样的结果
true condition
Exception in thread main java.lang.AssertionError: hello world
        at AssertTest.assertMe(AssertTest.java:14)
        at AssertTest.main(AssertTest.java:7)
Assert 最好不要滥用,原因是 assert 并不一定都是 enable 的,下面两种情况就不应该用 assert
1 不要再 public 的方法里面检查参数是不是为 null 之类的操作
例如 public int get(String s)
   {
       assert s != null;
   }
如果需要检查也最好通过 if s = null 抛出 NullPointerException 来检查
2 不要用 assert 来检查方法操作的返回值来判断方法操作的结果   
例如 assert list.removeAll(); 这样看起来好像没有问题 但是想想如果 assert 被 disable 呢,那样他就不会被执行了 所以 removeAll() 操作就没有被执行   可以这样代替
boolean boo = list.removeAl();
assert boo;

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

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

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

相关推荐

  • 数模笔记(五):变异系数法

    数模笔记(五):变异系数法数模笔记(一):线性规划、整数规划及非线性规划数模笔记(二):层次分析法数模笔记(三):灰色系统分析方法数模笔记(四):插值与拟合一、原理若某项指标的数值差异较大,能明确区分开各被评价对象,说明该指标的分辨信息丰富,因而应给该指标以较大的权重;反之,若各个被评价对象在某项指标上的数值差异较小,那么这项指标区分各评价对象的能力较弱,因而应给该指标较小的权重。因为方差可以描述取值的离散程度,即某指标的方差反映了该指标的的分辨能力,所以可用方差定义指标的…

    2022年6月8日
  • setScale,preScale和postScale的区别

    setScale,preScale和postScale的区别下面是Matrix3*3的矩阵结构[java] viewplaincopy1.   {MSCALE_X,MSKEW_X,MTRANS_X,  2.   MSKEW_Y,MSCALE_Y,MTRANS_Y,  3.   MPERSP_0,MPERSP_1,MPERSP_2}  一、首先介绍Scale缩放的控制scale就是缩放,我们调用Matrix的setSc

    2022年10月20日
  • 在网页文档中引入Vue.js的方法有哪些?_vue直接引入js文件没有用

    在网页文档中引入Vue.js的方法有哪些?_vue直接引入js文件没有用创建script标签的方法(定义自定义组件)代码如下(示例):exportdefault{components:{tabVue,’remote-js’:{render(createElement){returncreateElement(‘script’,{attrs:{type:’text/javascript’,src:this.src}});},props:{

    2022年10月8日
  • clientWidth offsetWidth innerWidth 区别(窗口尺寸 汇总)「建议收藏」

    clientWidth offsetWidth innerWidth 区别(窗口尺寸 汇总)「建议收藏」原文链接:http://www.cnblogs.com/youxin/archive/2012/09/21/2697514.htmlscrollWidth 是对象的实际内容的宽,不包边线宽度,会随对象中内容的多少改变(内容多了可能会改变对象的实际宽度)。 clientWidth 是对象可见的宽度,不包滚动条等边线,会随窗口的显示大小改变。 offsetWidth 是对象的可

    2022年7月22日
  • linux环境变量的配置_linux设置java的环境变量

    linux环境变量的配置_linux设置java的环境变量前言在自定义安装软件的时候,经常需要配置环境变量,下面进行详细解析 环境变量配置文件|用户|配置文件||:|:||系统环境|/ect/profil

    2022年8月6日
  • android错误之android.content.res.Resources$NotFoundException:

    错误:android.content.res.Resources$NotFoundException: String resource ID #0x1原因:一般发生在参数 int resId 错误,你把String赋值给int的resId,所以编译器找不到正确的resource于是报错。最简单的例子,检查一下你的Toast.makeText()啊textView.setText啊之类的函数

    2022年3月10日

发表回复

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

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