转自:http://lavasoft.blog.51cto.com/62575/43735/

Java陷阱之assert关键字

一、概述

在C和C++语言中都有assert关键,表示断言。

在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。

二、语法

在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。

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

1、assert

如果为true,则程序继续执行。

如果为false,则程序抛出AssertionError,并终止执行。

2、assert :

如果为true,则程序继续执行。

如果为false,则程序抛出java.lang.AssertionError,并输入。

三、应用实例

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

1 public classAssertFoo {2 public static voidmain(String args[]) {3 //断言1结果为true,则继续往下执行

4 assert true;5 System.out.println("断言1没有问题,Go!");6

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

9 //断言2结果为false,程序终止

10 assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!"; //这里如果将false换成一个“value>5”,就可以用来做value值的测试,这也是assert的作用11 System.out.println("断言2没有问题,Go!");12 }13 }

保存代码到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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。

java assert语句未执行_Java陷阱之assert关键字相关推荐

  1. java while语句打印三角形_Java 循环结构

    for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: while 循环 do-whi ...

  2. java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个

    前言 哈喽,大家好,我是asong,我又来做知识分享了. 对于做过Java开发的程序员来说,或许会遇到这个问题:java.lang.OutOfMemoryError: Unable to create ...

  3. java睡眠后继续执行_Java高级编程基础:如何使用线程的休眠,中断和连接

    线程休眠和中断 我们知道了在编程过程中创建线程,并启动以后,线程会交由操作系统来管理调度执行一个我们指定的计算任务. 如果没有其它异常情况出现的话,它会持续运行直到我们实现的run()方法执行完毕为止 ...

  4. java while语句打印三角形_java基础之五小节带你走进java流程控制—多重循环

    四.多重循环 在一个循环语句内部再嵌套一个或多个循环,称为多重循环/嵌套循环.while.do-while与for循环可以任意嵌套,可以嵌套任意多层.一般工作中多见的就是两层. 4.1 多重循环 打印 ...

  5. java switch语句套循环_java中switch语句和循环语句的使用

    java中switch语句和循环语句的使用 发布时间:2020-06-17 10:49:18 来源:亿速云 阅读:121 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java中switch语句 ...

  6. Java实例化后自动执行_Java的实例化顺序(程序执行顺序)

    加载/执行顺序: 牢记一点: 静态和非静态分开处理 使用到静态加载时,静态又分为: 静态变量, 静态代码块, 其中加载顺序是按照类中书写的先后顺序加载的 非静态加载顺序: 按照非静态书写顺序加载/执行 ...

  7. Java for 语句简化写法_Java 8 Lambda 写法与简化

    Java 8 的 Lambda 表达式的实现方式还是基于已有的字节码指令,由 Lambda 表达式的方法签名结合上下文并经由 SAM 推断出正确的类型来.Java 8 的 Lambda 完整书写格式是 ...

  8. java中方法未定义_java - Java SE中的未定义方法错误 - 堆栈内存溢出

    我为该问题写了一个代码http://www.spoj.com/problems/PRIME1/ ,该代码的作用是将输入以字符串形式输入,然后将split()拆分为两个整数,并存储在该数组中.然后返回到 ...

  9. java linux命令远程执行_java执行远程服务器上的shell命令

    所需jar包,commons-io-2.6.jar, ganymed-ssh2-262.jar import ch.ethz.ssh2.ChannelCondition; import ch.ethz ...

最新文章

  1. golang实践LSM相关内容
  2. linux ext4 文件大小,[svc]为何linux ext4文件系统目录默认大小是4k?
  3. java 面试题汇总
  4. linux_Nginx日志
  5. Linux定时任务案例
  6. (RMAN)使用恢复目录数据库执行RMAN步骤
  7. UnrealEngine4 - 关于UObject被自动GC垃圾回收的巨坑
  8. 软件测试:第六次作业
  9. IT-标准化-系列-15.在VPC 2007中构建虚拟网络
  10. LoadRunner测试139邮箱的脚本
  11. 软件测试术语 - 需求跟踪矩阵
  12. win2008r2 惠普g160鼠标_惠普M260鼠标驱动简单体验
  13. 利用域环境,处理瑞星网络版杀毒软件的问题
  14. 配置CKFinder(Java版)
  15. 定位点击WebBrowser、点击Flash、偷菜外挂
  16. Windows10 命令提示符中不能输入中文
  17. 【计算机网络】负载均衡
  18. Bugku CTF 眼见为实(MISC)
  19. 阿里云的认证有效期是多久?到期后怎么办呢?
  20. 制作VOC格式数据集的train.txt、val.txt文件

热门文章

  1. android 双卡流量统计,android流量统计
  2. input type类型_设备树下的input子系统
  3. 【离散数学】基础理论归纳
  4. 【机器学习】机器学习用到的常用术语
  5. 管理软件实施(3)——项目的生命周期
  6. 为什么要做短视频秒播优化
  7. Berenson机器人艺术鉴赏家亮相切尔西画廊
  8. Git入门及上传项目到github中
  9. 耳目一新!令人膜拜的牛人简历!厉害的攻城师啊
  10. dropdownlist可以多选。类似的例子。。。