﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-STATION-文章分类-java基础</title><link>http://www.blogjava.net/dhc/category/37032.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 29 Dec 2008 17:37:41 GMT</lastBuildDate><pubDate>Mon, 29 Dec 2008 17:37:41 GMT</pubDate><ttl>60</ttl><item><title>名词解释之assert【转载】</title><link>http://www.blogjava.net/dhc/articles/249032.html</link><dc:creator>DHC</dc:creator><author>DHC</author><pubDate>Mon, 29 Dec 2008 16:04:00 GMT</pubDate><guid>http://www.blogjava.net/dhc/articles/249032.html</guid><wfw:comment>http://www.blogjava.net/dhc/comments/249032.html</wfw:comment><comments>http://www.blogjava.net/dhc/articles/249032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dhc/comments/commentRss/249032.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dhc/services/trackbacks/249032.html</trackback:ping><description><![CDATA[<div>java assert的用法</div>
<div>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2">assert <span style="font-family: 宋体">是在</span> J2SE1.4 <span style="font-family: 宋体">中引入的新特性，</span> assertion <span style="font-family: 宋体">就是在代码中包括的布尔型状态，程序员认为这个状态是</span> true <span style="font-family: 宋体">。一般来说</span> assert <span style="font-family: 宋体">在开发的时候是检查程序的安全性的，在发布的时候通常都不使用</span> assert <span style="font-family: 宋体">。在</span> 1.4 <span style="font-family: 宋体">中添加了</span> assert <span style="font-family: 宋体">关键字和</span> java.lang.AssertError <span style="font-family: 宋体">类的支持。</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">首先，我们有必要从一个例子说起</span> assert </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">public class AssertTest</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;public static void main(String[] args)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;AssertTest at = new AssertTest();</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;at.assertMe(true);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;at.assertMe(false);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;} </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;private&nbsp;void assertMe(boolean boo)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;assert boo?true:false; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;System.out.println(true condition);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">}</font> </p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体">程序中包含了</span> assert <span style="font-family: 宋体">的话，你要用</span> javac -source 1.4 xxx.java <span style="font-family: 宋体">来编译，否则编译器会报错的。要想让</span> assert <span style="font-family: 宋体">得部分运行的话，要使用</span> java -ea xxx <span style="font-family: 宋体">来运行，否则包含</span> assert <span style="font-family: 宋体">得行会被忽略。下面我们运行</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: yellow; color: red"><font size="2">javac -source 1.4 AssertTest.java </font></span></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="background: yellow; color: red">java -ea AssertTest</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">看看结果的输出是：</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: yellow; color: red"><font size="2">true condition</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: yellow; color: red"><font size="2">Exception in thread main java.lang.AssertionError</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="background: yellow; color: red"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at AssertTest.assertMe(AssertTest.java:13)</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="background: yellow; color: red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at AssertTest.main(AssertTest.java:7)</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">当我们运行</span> at.assertMe(true) <span style="font-family: 宋体">得时候，由于</span> assert boo?true:false <span style="font-family: 宋体">相当于</span> assert true; <span style="font-family: 宋体">因此没有任何问题，程序往下执行打印出</span> true condition <span style="font-family: 宋体">，但是执行</span> at.assertMe(false) <span style="font-family: 宋体">的时候相当于</span> assert false <span style="font-family: 宋体">，这个时候解释器就会抛出</span> AssertionError <span style="font-family: 宋体">了，程序就终止了。大家必须清楚</span> AssertionError <span style="font-family: 宋体">是继承自</span> Error <span style="font-family: 宋体">得，因此你可以不再程序中</span> catch <span style="font-family: 宋体">它的，当然你也可以在程序中</span> catch <span style="font-family: 宋体">它然后程序可以继续执行。例如：</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">public class AssertTest</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;public static void main(String[] args)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;AssertTest at = new AssertTest();</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;try</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; at.assertMe(true);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; at.assertMe(false);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;catch(AssertionError ae)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; System.out.println(AsseriontError catched); </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;System.out.println(go on);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;} </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;private&nbsp;void assertMe(boolean boo)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;assert boo?true:false; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;System.out.println(true condition);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; assert <span style="font-family: 宋体">还有另外一种表达的方式，就是</span> assert exp1:exp2; <span style="font-family: 宋体">其中</span> exp1 <span style="font-family: 宋体">是个</span> boolean <span style="font-family: 宋体">返回值得表达式，而</span> exp2 <span style="font-family: 宋体">可以是原始的数据类型或者对象都可以例如：</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; boolean boo = true;</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; String str = null;</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp; assert boo = false <span style="font-family: 宋体">：</span> str=error; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">我们刚开始讲得</span> assert exp1 <span style="font-family: 宋体">得形式，当</span> exp1 <span style="font-family: 宋体">是</span> false <span style="font-family: 宋体">得时候，</span> AssertionError <span style="font-family: 宋体">得默认构造器会被调用，但是</span> assert exp1:exp2 <span style="font-family: 宋体">这样的形式，当</span> exp1 <span style="font-family: 宋体">为</span> true <span style="font-family: 宋体">的时候后面</span> exp2 <span style="font-family: 宋体">被或略，如果</span> false <span style="font-family: 宋体">的话，后面的表达式的结果会被计算出来并作为</span> AssertionError <span style="font-family: 宋体">得构造器参数。看下面的例子：</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">public class AssertTest</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;public static void main(String[] args)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;AssertTest at = new AssertTest();</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;at.assertMe(true);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;at.assertMe(false);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;} </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;private&nbsp;void assertMe(boolean boo)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;{</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;String s = null;</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;assert boo?true:false:s = hello world; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;System.out.println(true condition);</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;}</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">} <span style="font-family: 宋体">运行的时候会得到这样的结果</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">true condition</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">Exception in thread main java.lang.AssertionError: hello world</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at AssertTest.assertMe(AssertTest.java:14)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at AssertTest.main(AssertTest.java:7)</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">Assert <span style="font-family: 宋体">最好不要滥用，原因是</span> assert <span style="font-family: 宋体">并不一定都是</span> enable <span style="font-family: 宋体">的，下面两种情况就不应该用</span> assert </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><font style="background-color: #ffff33">1 <span style="font-family: 宋体">不要再</span> public <span style="font-family: 宋体">的方法里面检查参数是不是为</span> null <span style="font-family: 宋体">之类的操作</span> </font></font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">例如</span> public int get(String s) </font></p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; {</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assert s != null;</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">&nbsp;&nbsp; }</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2"><span style="font-family: 宋体">如果需要检查也最好通过</span> if s = null <span style="font-family: 宋体">抛出</span> NullPointerException <span style="font-family: 宋体">来检查</span> </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><font style="background-color: #ffff33">2 <span style="font-family: 宋体">不要用</span> assert <span style="font-family: 宋体">来检查方法操作的返回值来判断方法操作的结果</span> </font>&nbsp;&nbsp; </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font size="2"><span style="font-family: 宋体">例如</span> assert list.removeAll(); <span style="font-family: 宋体">这样看起来好像没有问题</span> <span style="font-family: 宋体">但是想想如果</span> assert <span style="font-family: 宋体">被</span> disable <span style="font-family: 宋体">呢，那样他就不会被执行了</span> <span style="font-family: 宋体">所以</span> removeAll() <span style="font-family: 宋体">操作就没有被执行</span> &nbsp;<span style="font-family: 宋体">可以这样代替<br />
</span></font><font size="2">boolean boo = list.removeAl();</font> </p>
<p style="margin: 0cm 0cm 0pt"><font size="2">assert boo;</font> </p>
</div>
  <img src ="http://www.blogjava.net/dhc/aggbug/249032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dhc/" target="_blank">DHC</a> 2008-12-30 00:04 <a href="http://www.blogjava.net/dhc/articles/249032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>