当前位置: 首页 > news >正文

断言

主要总结一下在eclipse中如何使用断言。

 

 

 


(一)首先明确:
java断言Assert是jdk1.4引入的。
jvm 断言默认是关闭的。
断言只适用于复杂的调试过程。
断言一般用于程序执行结果的判断,千万不要让断言处理业务流程。
(二)判断eclipse是否开启了断言,代码如下:
public class AssertTest {

public static void main(String[] args) {
boolean isOpen = false; 
assert isOpen=true; //如果开启了断言,会将isOpen的值改为true
System.out.println(isOpen);//打印是否开启了断言 
}
}
执行上面代码,如果打印 true说明已经启用了断言,如果为 false 则没有启用断言。
如果没有启用断言,则按按照下面方法开启断言。
(三)eclipse中开启断言
选择菜单:Run ---> Run Configurations...---> 选择 Arguments 选项卡
在 VM arguments 文本框中输入: -ea 注意:中间没有空格,如果输入 -da 表示禁止断言。

然后关闭该窗口,然后保存就开启了断言。

(四)断言使用

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

1、assert <boolean表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。

2、assert <boolean表达式> : <错误信息表达式>
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。

以下转自:Java陷阱之assert关键字

四、陷阱

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

 

 假如不写assert,调试的时候问题未必会暴露出来。此时就如问题所描述的,在调试的时候没事,可是到执行的时候出问题了你又没解决机制…… 比如说 FILE*fp;fp=fopen("错误的文件名?!","w+");不管文件存不存在,代码都会继续往下运行,问题一时半会不会暴露,有的时候说不定这次调试就没看出问题…… 如果写成 FILE*fp;fp=fopen("错误的文件名?!","w+");assert(fp!=NULL);在打开文件失败的时候就会立刻发现断言失败,调试中断,要求立刻修改代码,解决问题,这样才能在实际中不会出问题……

 

 

断言的副作用

  由于程序员的问题,断言的使用可能会带来副作用 ,例如:
  boolean isEnable=false;
  //...
  assert isEnable=true;
  这个断言的副作用是因为它修改了程序中变量的值并且未抛出错误,这样的错误如果不细心的检查是很难发现的。但是同时我们可以根据以上的副作用得到一个有用的特性,根据它来测试断言是否打开。

 public class AssertExampleTwo{

   public static void main(String args[]){
     boolean isEnable=false;
     //...
     assert isEnable=true;
     if(isEnable==false){
       throw new RuntimeException("Assertion shoule be enable!");
     }
   }
}

何时需要使用断言

  1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false
  2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
  3.使用断言测试方法执行的前置条件和后置条件
  4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)

什么地方不要使用断言

  断言语句不是永远会执行,可以屏蔽也可以启用
因此:
  1.不要使用断言作为公共方法的参数检查,公共方法的参数永远都要执行
  2.断言语句不可以有任何边界效应,不要使用断言语句去修改变量和改变方法的返回值
下边是介绍断言的用法:
  assert是在J2SE1.4中引入的新特性,assertion就是在代码中包括的布尔型状态,程序员认为这个状态是true。一般来说assert在开发的时候是检查程序的安全性的,在发布的时候通常都不使用assert。在1.4中添加了assert关键字和java.lang.AssertError类的支持。 

转载于:https://www.cnblogs.com/KingIceMou/p/7169104.html

相关文章:

  • html相关
  • 4、使用WebAPITestClient
  • 王自如与老罗的辩论赛谁赢了?!
  • 01背包模板
  • jQuery的masonry插件实现瀑布流布局
  • Mongo基本使用:
  • “可信网站”真的可信吗?
  • 安装wdcp linux一键安装包云系统客户端教程
  • HDU 5547 Sudoku(DFS)
  • FreeRTOS 消息队列
  • lintcode-109-数字三角形
  • 关于python ide
  • git学习
  • SVM
  • Java编码格式
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • classpath对获取配置文件的影响
  • java概述
  • Map集合、散列表、红黑树介绍
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • TypeScript迭代器
  • 搭建gitbook 和 访问权限认证
  • 跨域
  • 系统认识JavaScript正则表达式
  • 学习笔记:对象,原型和继承(1)
  • 走向全栈之MongoDB的使用
  • Java总结 - String - 这篇请使劲喷我
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #DBA杂记1
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT项目实战(天气预报)
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (分布式缓存)Redis持久化
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转) Android中ViewStub组件使用
  • (转)h264中avc和flv数据的解析
  • (轉)JSON.stringify 语法实例讲解
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 8.0 发布到 IIS
  • .NET Core引入性能分析引导优化
  • .Net Web窗口页属性
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • @Autowired自动装配
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RunWith注解作用
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [BUAA软工]第一次博客作业---阅读《构建之法》
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)