assert后面的表达式为假时会抛出AssertionError类对象,此类继承自Throwable类,可以用try..catch(AssertionError e)...语句捕获并处理,如果不处理,将会向其他Exception一样向上层调用抛出,导致线程运行中断。
使用assert的方法
assert适用于定义服务器的能力边界,如最大负载等,不适于对外部条件(例如检验用户输入格式)进行判断(参考http://stackoverflow.com/questions/1276308/exception-vs-assertion),因为处理这类问题的方法是给出一个反馈信息,而不是中断服务。基于此,应用开发初期可以用assert将流程运行的前提条件写出来,但在产品发布前应将这些临时assert改成正式的错误处理语句。
JUnit的assert*提供了比内置assert更丰富的判断方法,但本质上仍然是抛出AssertionError,且增加了对JUnit的依赖,因此不建议用JUnit代替assert。
(2012-12-19更新)
Java的assert关键字是从JAVA SE 1.4 引入的,为了和老版本兼容,Java在执行的时候默认是不启动断言检查的,这种情况下所有的assert语句都将被忽略。要开启断言检查,则需要在运行时加参数-enableassertions或-ea来开启,在Eclipse中,就是在要运行的类(或测试方法)的Run Configurations中的“Arguments”下的“VM arguments”部分写上:“-ea”。为了避免由于忘记加这个开关造成assert失效导致错误的测试结果,建议不要使用java的assert,而使用JUnit的org.junit.Assert.assertTrue(expr)方法。
assert关键字的两种用法:
- assert
如果
如果为false,则抛出 java.lang.AssertionError;
- assert
: <提示信息> (boolean表达式和提示信息之间用冒号分隔)
如果
如果为false,则抛出java.lang.AssertionError,并输出提示信息。
另外assert后面可以指定对哪些类断言生效,详见深入解析Java的新特性assertion。