所谓断言(assertion)是一个Java语句,布尔表达式,程序员认为在程序执行时该表达式的值应该为true。系统通过计算该布尔表达式执行断言,若该表达式为false系统会报告一个错误。

1、断言是通过assert关键字来声明的,断言功能的使用有两种格式:

assert expression ;     或者   assert expression : detailMessage ;

其中,expression为布尔表达式,detailMessage是基本数据类型或Object类型的值。当断言语句被执行时,Java计算expression的值,如果其值为false,抛出AssertionError异常。AssertionError类有一个默认的构造方法和七个重载的构造方法,它们有一个参数,类型分别为:intlongfloatdoublebooleancharObject。对于第一种断言语句没有详细信息,Java使用AssertionError类默认的构造方法。对于第二种带有一个详细信息的断言语句,将使用AssertionError类的与消息的数据类型匹配的构造方法。由于AssertionError类是Error类的子类,当断言为false时,程序将在控制台显示一条消息并终止程序的执行。

下面是一个使用断言的例子。

public class AssertionDemo{

public static void main(String[]args){

int i; int sum=0;

for(i=0;i<10;i++){  sum+=i;    }

assert i==10;

assert sum>10&&sum<5*10:"sum is "+sum;

}

}

上述程序中语句assert i==10断言i的值为10,如果i的值不为10将抛出AssertionError异常。语句assert sum>10&&sum<5*10:"sum is "+sum断言sum<5*10,如果为false,将抛出带有消息"sum is "+sum的AssertionError异常。

假如现在错误地输入了i<100而不是i<10,就会抛出下面的AssertionError异常:

Exception in thread “main” java.lang.AssertError

at AssertionDemo,main(AssertionDemo.java:7)

假如将sum+=i 错误地输入了sum+=1,就会抛出下面的AssertionError异常:

Exception in thread “main” java.lang.AssertError:sum is 10

at AssertionDemo,main(AssertionDemo.java:7)

2、启动和关闭断言功能

默认情况下,断言功能是关闭的。有两个命令行开关可以启用和关闭断言功能。为了使字节码编译器接受含有断言的代码,必须在编译命令中使用 –source 1.4选项。

javac –source 1.4  AssertionDemo.java

缺省情况下,断言机制在运行时是关闭的,要打开断言功能,在运行程序时需要使用 –enableassertions或-ea选项,例如:java –ea AssertionDemo

断言还可以在类的级别或包的级别打开或关闭。关闭断言的选项为-disableassertions或-da。例如,下面的命令在包package1的级别打开断言,而在Class1类上关闭断言:

java –ea:package1 –da:Class1 AssertionDemo。

3、使用异常处理或断言

断言不应该代替异常处理。异常处理主要处理程序运行时的非正常环境,断言主要是保证程序的正确性。异常处理实现程序的健壮而断言实现程序正确。与异常处理一样,断言并不用来一般的测试,而是保证内部一致性和有效性检查。断言在运行时被检查,在启动时可以打开或关闭。

不要在public方法中使用断言进行参数检查。传递给public方法的合法参数被认为方法的契约的一部分。不管断言是否打开,必须该服从该契约。例如,下面代码应该用异常处理重写。

public void setRadius(double newRadius){

assert newRadius >= 0;

radius = newRadius;

}

通常使用断言替换代码中的断言,例如下面的代码:

if(even){   …   }

else{   …    } //even is false

可以被替换成:

if(even){   …    }

else{   assert !even;   …   }

下面的代码:

if(numOfDollars > 1){   …    }

else(numOfDollars == 1){   …   }

可以被替换成:

if(numOfDollars > 1){   …    }

else(numOfDollars == 1){  …    }

else  assert false:numOfDollars;

另一个经常使用断言的地方是在switch语句中的default情况中,例如:

switch(month){

case 1: …; break;

case 2: …; break;

case 12: …; break;

default:assert false:”Invalid month:” + month;

}

4、通过编程启用断言

除了从命令行启用断言检查之外,您也可以通过编程启用(或禁用)检查。由于这仅影响将来装入的类,因此不能随意地关闭或打开它。

类的 ClassLoader 使用下面四种方法控制断言的启用和禁用:

1)public void setDefaultAssertionStatus(boolean enabled) : 该方法设置由类装入器装入的包和类的缺省状态。可以通过设置特定的包和类选项来覆盖该设置。

2)public void setPackageAssertionStatus(String packageName, boolean enabled) :要覆盖包和其所有的子包的状态,传入包名和启用状态。

3)public void setClassAssertionStatus(String className, boolean enabled) :要覆盖特定类的状态,传入全限定类名和启用状态。

4)public void clearAssertionStatus() :该方法将所有包和类的设置重设为 false,然后将类装入器也重设为 false。

例如:public class ClassLoaderAssert {

public static void main(String[] args) {         ClassLoaderAssert.class.getClassLoader().setDefaultAssertionStatus(true);// 将不会被执行

assert false : "123123";  // (1)

new AssertionDemo().main(new String[2]);  }

}

在上面的代码中将只执行AssertionDemo.java中的断言而不执行 (1) 所表示的断言。

转帖自:

断言java怎么用_[java] java断言的使用相关推荐

  1. java避免空指针异常_避免Java中的空指针异常

    java避免空指针异常 空指针异常是Java中最常见,最烦人的异常. 在这篇文章中,我想避免这种不希望的异常. 首先让我们创建引发空指针异常的示例 private Boolean isFinished ...

  2. java 异常对象_在java中的异常处理中的异常对象是什么

    展开全部 Exception类以及他的子类 的一个实例对象 比如32313133353236313431303231363533e58685e5aeb931333264633563 常见异常 1. j ...

  3. java 删除语句_是java语句

    <21天学通Java(第7版)>-- 第2章 Java编程基础 2.1 语句和表达式 本节书摘来异步社区<21天学通Java(第7版)>一书中的第2章,第2.1节,作者: [美 ...

  4. java 正则 空白字符_关于JAVA正则匹配空白字符的问题

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示"\u3000" ,这是什么? 这是全角空格!!! 查了一下    \s   ...

  5. java正则表达式 匹配()_学习Java正则表达式(匹配、替换、查找)

    import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public c ...

  6. java核心教程_核心Java教程

    java核心教程 Welcome to Core Java Tutorial. I have written a lot on Core Java and Java EE frameworks. Th ...

  7. java 包命名_【Java】包的命名规则

    命名规范 包:所有单词的字母小写,之后每个单词用-隔开,如 org.nemo.demo 常量:所有单词的字母大写,之后每个单词用_隔开,如 FLAG 类:所有单词的首字母大写,如 TestJava p ...

  8. java 图片效果_使用Java进行图片底片化效果处理

    使用java代码读取图片,并进行底片化处理 util importjava.awt.image.BufferedImage;importjava.io.File;importjava.util.Arr ...

  9. java array缓存_有java数组

    [JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...

  10. java 分割一个_分割java

    [java]分割字符串工具类,霸气 jdk自带的 java 分割字符串,分割string,可以根据多个条件去分割.比如逗号,分号,逗号或者分号. 比如一个字符串:"abc,def;gh,ij ...

最新文章

  1. 梯度提升树算法原理小结
  2. mysql约束添加删除数据_mysql中约束的添加,修改,与删除
  3. [激励机制]浅谈内部竞争——如何让你的员工玩命干活?
  4. 写了一篇关于 NLP 综述的综述!
  5. java sbyte_Java Byte parseByte()方法
  6. 爱库存:已实名举报唯品会不正当竞争行为
  7. 【Docker】Docker安装telnet
  8. Shiro-从数据表中初始化资源和权限
  9. asp.net DataTable导出 excel的方法记录(第三方)
  10. 优先队列/oriority queue 之最大优先队列的实现
  11. oracle启动pmon,oracle 11g pmon工作内容系列三
  12. 自己写歌怎么编曲?4款超好用编曲软件推荐
  13. 人在烟火间(外两章)
  14. BUUCTF笔记之Basic部分WP
  15. win8打印机显示服务器脱机,Win8连接局域网打印机失败解决方法汇总
  16. Science:无氧世界的古菌氨氧化
  17. 毕业一年小结——说好的战斗呢?
  18. labview 网络通讯 TCP
  19. 长短期记忆网络(LSTM)简述
  20. 计算机桌面背景寻梦环游记,《寻梦环游记 》海报及原画欣赏

热门文章

  1. android点击获得坐标,android点击MapView任意一点获得坐标
  2. DataGridView的列宽设置
  3. java listener 实现机制_Java监听器机制ServletContextListener实现执行某方法函数
  4. linux加入微软,微软正式加入Linux基金会
  5. python图形绘制糖_不给糖果就捣乱,用Python绘制有趣的万圣节南瓜怪!
  6. MySQL分页查询方法及优化
  7. 模块简介与matplotlib基础
  8. 开源 serverless 产品原理剖析 - Kubeless 1
  9. python-day02
  10. Android(java)学习笔记133:Eclipse中的控制台不停报错Can't bind to local 8700 for debugger...