Java陷阱之assert关键字

Java陷阱之assert关键字
 
1、概述
 
在C和C++语言中都有assert关键,表示断言。
在Java中,一样也有assert关键字,表示断言,用法和含义都差很少。
 
2、语法
 
在Java中,assert关键字是从JAVA SE 1.4 引入的,为了不和老版本的Java代码中使用了assert关键字致使错误,Java在执行的时候默认是不启动断言检查的(这个时候,全部的断言语句都将忽略!),若是要开启断言检查,则须要用开关-enableassertions或-ea来开启。
 
assert关键字语法很简单,有两种用法:
 
一、assert <boolean表达式>
若是<boolean表达式>为true,则程序继续执行。
若是为false,则程序抛出AssertionError,并终止执行。
 
二、assert <boolean表达式> : <错误信息表达式>
若是<boolean表达式>为true,则程序继续执行。
若是为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
 
3、应用实例
 
下面给出一个例子,经过例子说明其用法:
 
public class AssertFoo {
    public static void main(String args[]) {
        // 断言 1 结果为 true ,则继续往下执行
        assert true ;
        System. out .println( " 断言 1 没有问题, Go " );
 
        System. out .println( "\n-----------------\n" );
 
        // 断言 2 结果为 false,程序终止
        assert false : " 断言失败,此表达式的信息将会在抛出异常的时候输出! " ;
        System. out .println( " 断言 2 没有问题, Go " );
    }
}
 
保存代码到C:\AssertFoo.java,而后按照下面的方式执行,查看控制台输出结果:
 
一、编译程序:
C:\>javac AssertFoo.java
 
二、默认执行程序,没有开启-ea开关:
C:\>java AssertFoo
断言1没有问题,Go!
 
-----------------
 
断言2没有问题,Go!
 
三、开启-ea开关,执行程序:
C:\>java -ea AssertFoo
断言1没有问题,Go!
 
-----------------
 
Exception in thread "main" java.lang.AssertionError: 断言失败,此表达式的信息将
会在抛出异常的时候输出!
        at AssertFoo.main(AssertFoo.java:10)
 
4、陷阱
 
assert关键字用法简单,可是使用assert每每会让你陷入愈来愈深的陷阱中。应避免使用。笔者通过研究,总结了如下缘由:
 
一、assert关键字须要在运行时候显式开启才能生效,不然你的断言就没有任何意义。而如今主流的Java IDE工具默认都没有开启-ea断言检查功能。这就意味着你若是使用IDE工具编码,调试运行时候会有必定的麻烦。而且,对于Java Web应用,程序代码都是部署在容器里面,你无法直接去控制程序的运行,若是必定要开启-ea的开关,则须要更改Web容器的运行配置参数。这对程序的移植和部署都带来很大的不便。
 
二、用assert代替if是陷阱之二。assert的判断和if语句差很少,但二者的做用有着本质的区别:assert关键字本意上是为测试调试程序时使用的,但若是不当心用assert来控制了程序的业务流程,那在测试调试结束后去掉assert关键字就意味着修改了程序的正常的逻辑。
 
三、assert断言失败将面临程序的退出。这在一个生产环境下的应用是毫不能容忍的。通常都是经过异常处理来解决程序中潜在的错误。可是使用断言就很危险,一旦失败系统就挂了。
 
 
5、对assert的思考
 
assert既然是为了调试测试程序用,不在正式生产环境下用,那应该考虑更好的测试JUint来代替其作用,JUint相对assert关键的所提供的功能是有过之而无不及。固然彻底能够经过IDE debug来进行调试测试。在此看来,assert的前途一片昏暗。
 
所以,应当避免在Java中使用assert关键字,除非哪一天Java默认支持开启-ea的开关,这时候能够考虑。对比一下,assert能给你带来多少好处,多少麻烦,这是咱们选择是否使用的的原则。
 
以上仅仅表明我我的观点,欢迎你们留言讨论。
相关文章
相关标签/搜索