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;

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

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

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


相关推荐

  • leetcode – Missing Ranges

    leetcode – Missing Ranges

    2022年1月13日
    49
  • latex多行公式一个编号_组合公式大括号

    latex多行公式一个编号_组合公式大括号本文的主要内容有:如何输入行内公式如何输入行间公式、多行公式常用的数学符号输入方法相信观察力敏锐的同学一定已经注意到在上一次的推送里的这段代码:\documentclass[a4paper,12pt,landscape,twocolumn]{book}\usepackage{amsmath}\begin{document}$\frac{x}{y}$\[\i…

    2022年10月9日
    0
  • html5空白站位符号,空格代码(隐形空白符号)

    html5空白站位符号,空格代码(隐形空白符号)CSS的空间处理一、空格规则浏览器通常会忽略HTML代码中的空白。上面是一行HTML代码,文本的前面、里面和后面各有两个空格。为了便于识别,这里使用半圆形符号来表示空间。浏览器的输出如下。你好世界如您所见,文本前后的空格将被忽略,内部连续的空格将只被算作一个。这是浏览器处理空格的基本规则。如果希望空格按原样输出,可以使用前置标签。另一种方法是用HTML实体来代替表示空格。二、空格字符处理空格的HT…

    2022年9月16日
    0
  • 新秀学习51供应链管理的—-模拟笔记本PC和51串行通讯1

    新秀学习51供应链管理的—-模拟笔记本PC和51串行通讯1

    2022年1月16日
    44
  • pycharm python解释器找不到,pycharm找不到解释器怎么办[通俗易懂]

    pycharm python解释器找不到,pycharm找不到解释器怎么办[通俗易懂]解决方法:1、打开磁盘,直接搜索python.exe文件,获取该文件的路径;2、打开pycharm软件,依次点击“File”–“Setting”–“Project”,点击右上角的设置图标;3、按照获取的路径找到python.exe即可。本教程操作环境:windows7系统、Pycharm2019版,DELLG3电脑pycharm中找不到解释器的解决方法:1、打开File–>Setting–…

    2022年8月26日
    2
  • mtk驱动安装_UBOOT下U盘驱动移植

    mtk驱动安装_UBOOT下U盘驱动移植对于MTKCamera驱动移植一般分为四部分:1、硬件IO口配置;2、Camera驱动移植;3、上电时序;4、修改i2c控制器;硬件电路:1、GPIO配置打开 mediatek\dct\DrvGen.exe 选择mediatek\custom\xiaoxi\kernel\dct\dct\codegen.

    2025年7月22日
    0

发表回复

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

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