zoukankan      html  css  js  c++  java
  • Java陷阱之assert关键字

    Java陷阱之assert关键字
     
    一、概述
     
    在C和C++语言中都有assert关键,表示断言。
    在Java中,同样也有assert关键字,表示断言,用法和含义都差不多。
     
    二、语法
     
    在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语句都 将忽略!),如果要开启断言检查,则需要用开关-enableassertions或-ea来开启。
     
    assert关键字语法很简单,有两种用法:
     
    1、assert <boolean表达式>
    如果<boolean表达式>为true,则程序继续执行。
    如果为false,则程序抛出AssertionError,并终止执行。
     
    2、assert <boolean表达式> : <错误信息表达式>
    如果<boolean表达式>为true,则程序继续执行。
    如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
     
    三、应用实例
     
    下面给出一个例子,通过例子说明其用法:
     
    public class AssertFoo {
        public static void main(String args[]) {
            //断言1结果为true,则继续往下执行
            assert true;
            System.out.println("断言1没有问题,Go!");
     
            System.out.println(" ----------------- ");
     
            //断言2结果为false,程序终止
            assert false : "断言失败,此表达式的信息将会在抛出异常的时候输出!";
            System.out.println("断言2没有问题,Go!");
        }
    }
     
    保存代码到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能给你带来多少好处,多少麻烦,这是我们选择是否使用的的原则。
     
    以上仅仅代表我个人观点,欢迎大家留言讨论。
  • 相关阅读:
    atitit.nfc 身份证 银行卡 芯片卡 解决方案 attilax总结
    atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
    Atitit.执行cmd 命令行 php
    Atitit. 图像处理jpg图片的压缩 清理垃圾图片 java版本
    atitit。企业组织与软件工程的策略 战略 趋势 原则 attilax 大总结
    atitit. 管理哲学 大毁灭 如何防止企业的自我毁灭
    Atitit.java的浏览器插件技术 Applet japplet attilax总结
    Atitit.jquery 版本新特性attilax总结
    Atitit. 软件开发中的管理哲学一个伟大的事业必然是过程导向为主 过程导向 vs 结果导向
    (转)获取手机的IMEI号
  • 原文地址:https://www.cnblogs.com/waycool/p/5830382.html
Copyright © 2011-2022 走看看