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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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;

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数学建模算法学习——各类模型算法汇总[通俗易懂]

    数学建模算法学习——各类模型算法汇总[通俗易懂]相关模型解决的问题数据分析类算法一览100个经典动态规划方程优化问题线性规划简介:线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号。为了避免这种形式多样性带来的不便,Matlab中规定线性规划的标准形式为其中c和x为n维列向量,A、Aeq为适当维数的矩阵,b、beq为适当维数的列向量。代码实现…

  • js 删除换行符

    js 删除换行符mymsg=mymsg.replace(/<\/?.+?>/g,””);//html2txt去掉html标记mymsg=mymsg.replace(/\n|\r/g,””);//去掉换行转载于:https://www.cnblogs.com/jerryLee/archive/2010/02/01/1661036.html…

  • 在C#代码中应用Log4Net 中配置文件的解释

    在C#代码中应用Log4Net 中配置文件的解释

  • Kong插件开发向导

    Kong插件开发向导转载李亚飞大佬的文章:https://www.lyafei.com/简介前面洋洋洒洒写了那么多文章,Kong搭建、Konga搭建、Kong插件开发工具包、Lua算法实现等等,就为了这篇Kong插件开发铺垫,在进一步讨论之前,有必要再简要阐述下Kong是如何构建的,特别是它如何与Nginx集成,以及它与Lua脚本之间的关系。使用lua-nginx-module模块可以在Nginx中启用Lua脚本功能,Kong与OpenResty一起发布,OpenResty中已经包.

  • scala 隐式转换

    scala 隐式转换文章目录作用解决什么问题使用implicits的一些规则3.1.1标记规则3.1.2范围规则3.1.3一次规则3.1.4优先规则3.1.5命名规则3.1.6编译器使用implicit的几种情况3.2隐含类型转换3.3转换被方法调用的对象3.3.1支持新的类型3.3.2模拟新的语法结构实验总结implicit基本含义隐式转换隐式转换的另一个优点是它们支持目标类型转换.隐式转换操作规则隐式参数和spring的依赖注入之前关系与区别隐式转换类(ImplicitClasses)隐式类

    2022年10月11日
  • 决策树原理详解_决策树的理解

    决策树原理详解_决策树的理解决策树是机器学习中一种基本的分类和回归算法,是依托于策略抉择而建立起来的树。其主要优点是模型具有可读性,分类速度快,易于理解。决策树的思想主要来源于Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及有Breiman等人在1984年提出的CART算法。1.什么是决策树决策树简单来说就是带有判决规则(if-then)的一种树,可以依据树中的判决规则来预测未知样本的类…

发表回复

您的电子邮箱地址不会被公开。

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