??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区欧美,www国产精品,www.亚洲.comhttp://www.aygfsteel.com/luckyrobbie/<font size=-1>JAVA是蓝色的-</font> <!-- Start FastOnlineUsers.com --> <a ><script type="text/javascript" src="http://fastonlineusers.com/on2.php?d=www.aygfsteel.com/luckyrobbie"></script> online</a><!-- End FastOnlineUsers.com -->zh-cnSun, 18 May 2025 12:51:46 GMTSun, 18 May 2025 12:51:46 GMT60_ֽ的“六一?/title><link>http://www.aygfsteel.com/luckyrobbie/archive/2006/06/12/52195.html</link><dc:creator>luckyrobbie</dc:creator><author>luckyrobbie</author><pubDate>Mon, 12 Jun 2006 06:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/luckyrobbie/archive/2006/06/12/52195.html</guid><wfw:comment>http://www.aygfsteel.com/luckyrobbie/comments/52195.html</wfw:comment><comments>http://www.aygfsteel.com/luckyrobbie/archive/2006/06/12/52195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luckyrobbie/comments/commentRss/52195.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luckyrobbie/services/trackbacks/52195.html</trackback:ping><description><![CDATA[ <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <span style="mso-tab-count: 1">   </span> </span>贝贝在宜城中心幼儿园的第一个“六一”国际儿童节l于来到了,q对于我们全家来说可是一个大日子。早上v来,贝贝却有Ҏ心我们不陪他一起参加幼儿园的庆活动,从而流露出一丝焦虑。其实我们才不会错过q个隑־的机会呢Q更何况爸爸妈妈和贝贝一起准备的歌舞“小军”,也将在今天的庆祝zd中一起亮相呢?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 150%"> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <span style="mso-tab-count: 1">       </span> </span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">早上九点Q我们准时来到幼儿园。作为小朋友们的乐园Q这里欢歌笑语,张灯l彩Q处处洋溢着儿童节的Ƣ快气氛Q贝贝也很快p入到节日的氛围之中了?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">??xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?><st1:personname w:st="on" productid="?>?/st1:personname>?st1:personname w:st="on" productid="师和?>师和?/st1:personname>老师井然有序的安排下Q小一班的庆祝zd开始了。小朋友们分l表演了儿歌和童谣。轮到贝贝这一l开始表演了Q我们赶快准备拍照和摄像Q一定要把这_ֽ的瞬间捕捉记录下来。?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">?/span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">公鸡每天早早P母鸡生蛋孵小?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">…?/span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q小朋友们花朵般q嫩的歌喉伴随着可爱的舞y动作吸引了在场的每一位家ѝ当我们q都沉浸在刚才精彩的q儿歌舞表演Ӟ安们的味游戏“水果蹲”开始了Q我和贝贝妈妈也U极参与了这个游戏。家长们的表现让朋友们忍俊不止Q“咯咯咯</span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%">?/span> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">咯咯咯”,一串串的笑声渲染了每一位大人和朋友?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">贝贝今天的表现很,?st1:personname w:st="on" productid="?>?/st1:personname>老师说请贝贝家庭表演歌舞“小军”时Q他很快大大方方地跑到舞台中央Q声韛_亮,和爸怸起唱起小军q首儿歌Q同时动作流畅,和妈妈一赯着舞蹈Q开开心心地完成了q个节目Q赢得了大家的一片掌声。我们一直都很珍惜与贝贝一同参加集体活动的ZQ因此心中尤Zq次在幼儿园里和贝贝一起同台表演而感到高兴。接下来Q其他的家庭也都表演了各自精彩的节目Q有讲故事、钢琴独奏、双,q有术Q众彩纷呈的节目把这ơ活动的气氛推向高潮。以至于zd落下帷幕Ӟ安和小朋友们都q恋恋不舍呢?/span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <o:p> </o:p> </span> </p> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%"> <span style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">回家后,贝贝y蹦跌Q不时唱着儿歌Q似乎还对今天的zd意犹未尽。“六一”儿童节Q我们全家过得开心而有意义。通过q次zd增强了贝贝在集体zd中的自信心和责Q感,同时也加Z我们?span style="COLOR: black">贝贝之间的互动体验?/span></span> <span lang="EN-US" style="FONT-SIZE: 12pt; LINE-HEIGHT: 150%"> <o:p> </o:p> </span> </p> <img src ="http://www.aygfsteel.com/luckyrobbie/aggbug/52195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luckyrobbie/" target="_blank">luckyrobbie</a> 2006-06-12 14:05 <a href="http://www.aygfsteel.com/luckyrobbie/archive/2006/06/12/52195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>话三则http://www.aygfsteel.com/luckyrobbie/archive/2006/04/23/42616.htmlluckyrobbieluckyrobbieSun, 23 Apr 2006 03:02:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/04/23/42616.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/42616.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/04/23/42616.html#Feedback0http://www.aygfsteel.com/luckyrobbie/comments/commentRss/42616.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/42616.html早上Q贝贝站在我的摩托Rt板上,我送他d儿园。开到roundabout的地ҎQ贝贝说Q爸爸就开q个温度吧?我问Q什么? 贝贝_是速度Q不要再加速度了?br />
2
贝贝喜欢打电脑游戏,前几天特别喜Ƣ玩一个哆啦A梦钓鱼的flash游戏Q如果不心会钓到鲨|而且我们不让他多玩。一天贝贝睡觉做梦而大哭,叫醒后问他做C么梦了,他说Q爸怸让我玩钓|而且钓到了鲨鱼把猫吃掉了?br />
3
晚上吃樱桃,贝贝吃的很开心,q挑出红的给我吃。我对贝贝说Q挑1_给妈妈吃吃Q去拍拍她的马屁。于是贝贝选了一个红的樱桃,跑到妈妈边上_妈妈Q喏Q吃个马屁?img src ="http://www.aygfsteel.com/luckyrobbie/aggbug/42616.html" width = "1" height = "1" />

luckyrobbie 2006-04-23 11:02 发表评论
]]>
Hibernate学习(1)http://www.aygfsteel.com/luckyrobbie/archive/2006/04/18/41660.htmlluckyrobbieluckyrobbieTue, 18 Apr 2006 07:53:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/04/18/41660.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/41660.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/04/18/41660.html#Feedback0http://www.aygfsteel.com/luckyrobbie/comments/commentRss/41660.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/41660.html1. 域模型也UCؓ设计模型Q由以下内容l成Q?br />    h状态和行ؓ的域对象
    域对象之间的关系

2. 域对?Domain Object) - 对真实世界的实体的Y件抽象,也叫业务对象(Business Object)Q分为:
    实体域对?实体EJBQPOJO)Qؓ每个实体域对象分配OID(Object Identifier)
    q程域对?Session Bean, Message Driven Bean, Java Bean)
    事g域对?事g触发)
  三种域对象位于业务逻辑?br />
3. 域对象之间的关系
    兌(Association)Qone to one, one to many, many to many, 单向, 双向
    依赖(Dependency)Q类与类之间的访问关p,如果A讉KB的属性或者方法,或者A负责实例化BQ则A依赖B。过E域对象往往依赖实体域对象?br />    聚集(Aggregation)Q整体与部分之间的关p,实体域对象之间常见。聚集关pd兌关系有相同的形式Q区别是Q对于聚集关p,部分cȝ对象不能单独存在Q它的生命周期依赖于整体cȝ对象的生命周期;对于兌关系?个类Q可以分别单独存在?br />    一般化(Generalization)

     
   



luckyrobbie 2006-04-18 15:53 发表评论
]]>
刚刚解决一个hsqldb的初U问?/title><link>http://www.aygfsteel.com/luckyrobbie/archive/2006/04/06/39688.html</link><dc:creator>luckyrobbie</dc:creator><author>luckyrobbie</author><pubDate>Thu, 06 Apr 2006 14:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/luckyrobbie/archive/2006/04/06/39688.html</guid><wfw:comment>http://www.aygfsteel.com/luckyrobbie/comments/39688.html</wfw:comment><comments>http://www.aygfsteel.com/luckyrobbie/archive/2006/04/06/39688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luckyrobbie/comments/commentRss/39688.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luckyrobbie/services/trackbacks/39688.html</trackback:ping><description><![CDATA[ <p>q?天用hsqldb做hibernate试Q做insertӞ不论用hibernate的方法还是用jdbc的方法,昄的一切信息都是成功的Q可是后来打开hsqldb的managerQ发现table里面没有记录insertQ?img height="20" src="http://www.aygfsteel.com/Emoticons/QQ/12.gif" width="20" border="0" />郁闷之极Q觉得应该是hsqldb的配|问?br /><br />于是打开那个script文gQ最后找到这句配|:SET WRITE_DELAY 20<br />改ؓSET WRITE_DELAY 0后,一切正怺<img height="19" src="http://www.aygfsteel.com/Emoticons/QQ/22.gif" width="19" border="0" /></p> <img src ="http://www.aygfsteel.com/luckyrobbie/aggbug/39688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luckyrobbie/" target="_blank">luckyrobbie</a> 2006-04-06 22:32 <a href="http://www.aygfsteel.com/luckyrobbie/archive/2006/04/06/39688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>msdn中对于正则表辑ּ的介l?/title><link>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/30/38210.html</link><dc:creator>luckyrobbie</dc:creator><author>luckyrobbie</author><pubDate>Thu, 30 Mar 2006 03:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/30/38210.html</guid><wfw:comment>http://www.aygfsteel.com/luckyrobbie/comments/38210.html</wfw:comment><comments>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/30/38210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luckyrobbie/comments/commentRss/38210.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luckyrobbie/services/trackbacks/38210.html</trackback:ping><description><![CDATA[ <div> <a > <font color="#004377">http://msdn.microsoft.com/library/CHS/jscript7/html/jsreconIntroductionToRegularExpressions.asp?frame=true</font> </a> </div> <img src ="http://www.aygfsteel.com/luckyrobbie/aggbug/38210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luckyrobbie/" target="_blank">luckyrobbie</a> 2006-03-30 11:05 <a href="http://www.aygfsteel.com/luckyrobbie/archive/2006/03/30/38210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用decorate模式M张画http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37638.htmlluckyrobbieluckyrobbieMon, 27 Mar 2006 08:56:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37638.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/37638.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37638.html#Feedback0http://www.aygfsteel.com/luckyrobbie/comments/commentRss/37638.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/37638.html我对decorate模式的理解:
1-首先要有一个InterfaceQ提供一个通用的方法;
2-其次有n多个class来实现这个接口中的方法,q些实现Ҏ在功能上应该是ƈ列的Q但不是必须的,从而可以根据需要decorate那个需要被修饰的初始对象?br />3-最后这些class都有一个带有Interface作ؓ参数的构造方法和一个Interface的属性,q样在构造的时候就可以取得那个需要修饰的对象的实例,然后在实现Interface的方法里面,首先实现修饰对象实例的修饰方法,然后再进行自qdecorateҎ?br />
Ҏq个x来画一张画Q?/p>
package  test;

public   interface  Painting  {
    
public   void  paint();
}


class  SunPainting  implements  Painting  {
    Painting painting 
=   null ;

    
public  SunPainting()  {
    }


    
public  SunPainting(Painting painting)  {
        
this .painting  =  painting;
    }


    
public   void  paint()  {
        
if  (painting  !=   null {
            painting.paint();
        }

        System.out.println(
" M一个太?img src="http://www.aygfsteel.com/images/dot.gif" /> " );
    }

}


class  CloudPainting  implements  Painting  {
    Painting painting 
=   null ;

    
public  CloudPainting()  {
    }


    
public  CloudPainting(Painting painting)  {
        
this .painting  =  painting;
    }


    
public   void  paint()  {
        
if  (painting  !=   null {
            painting.paint();
        }

        System.out.println(
" M一늙?img src="http://www.aygfsteel.com/images/dot.gif" /> " );
    }

}


class  LawnPainting  implements  Painting  {
    Painting painting 
=   null ;

    
public  LawnPainting()  {
    }


    
public  LawnPainting(Painting painting)  {
        
this .painting  =  painting;
    }


    
public   void  paint()  {
        
if  (painting  !=   null {
            painting.paint();
        }

        System.out.println(
" M一片草?img src="http://www.aygfsteel.com/images/dot.gif" /> " );
    }

}

再写D|试画ȝ代码:

package  test;

public   class  TestPainting  {
    
public   static   void  main(String[] args) {
        
new  SunPainting( new  CloudPainting( new  LawnPainting())).paint();
    }

}

试l果:

M一片草?img src="http://www.aygfsteel.com/images/dot.gif" />
M一늙?img src="http://www.aygfsteel.com/images/dot.gif" />
M一个太?img src="http://www.aygfsteel.com/images/dot.gif" />


 最后有个问题:Z么不直接定义一个画ȝc,然后把这些该怎么ȝ事情分别通过Ҏ来实现呢Q?那么什么情况下使用decorate模式更ؓ合适呢Q?/font>



luckyrobbie 2006-03-27 16:56 发表评论
]]>
用六大代码问题检验你的Java知识能力http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37553.htmlluckyrobbieluckyrobbieMon, 27 Mar 2006 02:17:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37553.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/37553.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37553.html#Feedback0http://www.aygfsteel.com/luckyrobbie/comments/commentRss/37553.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/37553.html
        1 OutputStreamWriter out = ...
  2 java.sql.Connection conn = ...
  3 try { // ?br />  4 Statement stat = conn.createStatement();
  5 ResultSet rs = stat.executeQuery(
  6 "select uid, name from user");
  7 while (rs.next())
  8 {
  9 out.println("IDQ? + rs.getString("uid") // ?br />  10 "Q姓名:" + rs.getString("name"));
  11 }
  12 conn.close(); // ?br />  13 out.close();
  14 }
  15 catch(Exception ex) // ?br />  16 {
  17 ex.printStackTrace(); // _?br />  18 }

作ؓ一个JavaE序员,你至应该能够找Z个问题。但是,如果你不能找出全部六个问题,Ll阅L文?

本文讨论的不是Java异常处理的一般性原则,因ؓq些原则已经被大多数人熟知。我们要做的是分析各U可UCؓ“反例”(anti-patternQ的q背优秀~码规范的常见坏习惯Q帮助读者熟悉这些典型的反面例子Q从而能够在实际工作中敏锐地察觉和避免这些问题?

反例之一Q丢弃异?

代码Q?5?18行?

q段代码捕获了异常却不作M处理Q可以算得上Java~程中的杀手。从问题出现的频J程度和害E度来看Q它也许可以和C/C++E序的一个恶名远播的问题相提q论??不检查缓冲区是否已满?

如果你看Cq种丢弃Q而不是抛出)异常的情况,可以癑ֈ之九十九地肯定代码存在问题(在极数情况下,q段代码有存在的理由Q但最好加上完整的注释Q以免引起别解)?

q段代码的错误在于,异常Q几乎)L意味着某些事情不对劲了Q或者说臛_发生了某些不d的事情,我们不应该对E序发出的求救信号保持沉默和无动于衷。调用一下printStackTrace不上“处理异常”?

不错Q调用printStackTrace对调试程序有帮助Q但E序调试阶段l束之后QprintStackTrace׃应再在异常处理模块中担负主要责Q了?

丢弃异常的情形非常普遍。打开JDK的ThreadDeathcȝ文档Q可以看C面这D说明:“特别地Q虽然出现ThreadDeath是一U‘正常的情Ş’,但ThreadDeathcLError而不是Exception的子c,因ؓ许多应用会捕h有的Exception然后丢弃它不再理睬?

”这D话的意思是Q虽然ThreadDeath代表的是一U普通的问题Q但鉴于许多应用会试图捕h有异常然后不予以适当的处理,所以JDK把ThreadDeath定义成了Error的子c,因ؓErrorcM表的是一般的应用不应该去捕获的严重问题。可见,丢弃异常q一坏习惯是如此常见Q它甚至已经影响CJava本n的设计?

那么Q应该怎样Ҏ呢?主要有四个选择Q?

1、处理异常。针对该异常采取一些行动,例如修正问题、提醒某个h或进行其他一些处理,要根据具体的情Ş定应该采取的动作。再ơ说明,调用printStackTrace不上已l“处理好了异常”?

2、重新抛出异常。处理异常的代码在分析异怹后,认ؓ自己不能处理它,重新抛出异常也不׃ؓ一U选择?

3、把该异常{换成另一U异常。大多数情况下,q是指把一个低U的异常转换成应用的异常(其含义更Ҏ被用户了解的异常Q?

4、不要捕获异常?

l论一Q既然捕获了异常Q就要对它进行适当的处理。不要捕获异怹后又把它丢弃Q不予理睬?

反例之二Q不指定具体的异?

代码Q?5行?

许多时候h们会被这样一U“美妙的”想法吸引:用一个catch语句捕获所有的异常。最常见的情形就是用catch(Exception

ex)语句。但实际上,在绝大多数情况下Q这U做法不值得提倡。ؓ什么呢Q?

要理解其原因Q我们必d一下catch语句的用途。catch语句表示我们预期会出现某U异常,而且希望能够处理该异常。异常类的作用就是告诉Java~译器我们想要处理的是哪一U异常?

׃l大多数异常都直接或间接从java.lang.ExceptionzQcatch(Exception ex)q当于说我们想要处理几乎所有的异常?

再来看看前面的代码例子。我们真正想要捕L异常是什么呢Q最明显的一个是SQLExceptionQ这是JDBC操作中常见的异常。另一个可能的异常是IOExceptionQ因为它要操作OutputStreamWriter?

昄Q在同一个catch块中处理q两U截然不同的异常是不合适的。如果用两个catch块分别捕获SQLException和IOExceptionp好多了。这是_catch语句应当量指定具体的异常类型,而不应该指定늛范围太广的ExceptioncR?

另一斚wQ除了这两个特定的异常,q有其他许多异常也可能出现。例如,如果׃某种原因QexecuteQueryq回了nullQ该怎么办?{案是让它们l箋抛出Q即不必捕获也不必处理。实际上Q我们不能也不应该去捕获可能出现的所有异常,E序的其他地方还有捕获异常的Z直至最后由JVM处理?

l论二:在catch语句中尽可能指定具体的异常类型,必要时用多个catch。不要试囑֤理所有可能出现的异常?

反例之三Q占用资源不释放

代码Q??14行?

异常改变了程序正常的执行程。这个道理虽然简单,却常常被Z忽视。如果程序用C文g、Socket、JDBCq接之类的资源,即遇到了异常,也要正确释放占用的资源。ؓ此,Java提供了一个简化这cL作的关键词finally?

finally是样好东西:不管是否出现了异常,Finally保证在try/catch/finally块结束之前,执行清理d的代码L有机会执行。遗憄是有些h却不习惯使用finally?

当然Q编写finally块应当多加小心,特别是要注意在finally块之内抛出的异常??q是执行清理d的最后机会,量不要再有难以处理的错误?

l论三:保证所有资源都被正释放。充分运用finally关键词?

反例之四Q不说明异常的详l信?

代码Q??18行?

仔细观察q段代码Q如果@环内部出C异常Q会发生什么事情?我们可以得到_的信息判断@环内部出错的原因吗?不能。我们只能知道当前正在处理的cd生了某种错误Q但却不能获得Q何信息判断导致当前错误的原因?

printStackTrace的堆栈跟t功能显C出E序q行到当前类的执行流E,但只提供了一些最基本的信息,未能说明实际D错误的原因,同时也不易解诅R?

因此Q在出现异常Ӟ最好能够提供一些文字信息,例如当前正在执行的类、方法和其他状态信息,包括以一U更适合阅读的方式整理和l织printStackTrace提供的信息?

l论四:在异常处理模块中提供适量的错误原因信息,l织错误信息使其易于理解和阅诅R?

反例之五Q过于庞大的try?

代码Q??14行?

l常可以看到有h把大量的代码攑օ单个try块,实际上这不是好习惯。这U现象之所以常见,原因在于有些h囄事,不愿花时间分析一大块代码中哪几行代码会抛出异常、异常的具体cd是什么。把大量的语句装入单个巨大的try块就象是出门旅游时把所有日常用品塞入一个大子Q虽然东西是带上了,但要扑և来可不容易?

一些新手常常把大量的代码放入单个try块,然后再在catch语句中声明ExceptionQ而不是分d个可能出现异常的D落q分别捕获其异常。这U做法ؓ分析E序抛出异常的原因带来了困难Q因Z大段代码中有太多的地方可能抛出Exception?

l论五:量减小try块的体积?

反例之六Q输出数据不完整

代码Q??11行?

不完整的数据是JavaE序的隐形杀手。仔l观察这D代码,考虑一下如果@环的中间抛出了异常,会发生什么事情。@环的执行当然是要被打断的Q其ơ,catch块会执行??p些,再也没有其他动作了?

已经输出的数据怎么办?使用q些数据的h或设备将收到一份不完整的(因而也是错误的Q数据,却得不到M有关q䆾数据是否完整的提C。对于有些系l来_数据不完整可能比pȝ停止q行带来更大的损失?

较ؓ理想的处|办法是向输备写一些信息,声明数据的不完整性;另一U可能有效的办法是,先缓冲要输出的数据,准备好全部数据之后再一ơ性输出?

l论六:全面考虑可能出现的异总及这些异常对执行程的媄响?

改写后的代码

Ҏ上面的讨论,下面l出改写后的代码。也许有Z说它E微有点?嗦,但是它有了比较完备的异常处理机制?


OutputStreamWriter out = ...
  java.sql.Connection conn = ...
  try {
   Statement stat = conn.createStatement();
   ResultSet rs = stat.executeQuery("select uid, name from user");
   while (rs.next()){
    out.println("IDQ? + rs.getString("uid") + "Q姓? "+ rs.getString("name"));
   }
  }
  catch(SQLException sqlex)
  {
   out.println("警告Q数据不完整");
   throw new ApplicationException("d数据时出现SQL错误", sqlex);
  }
  catch(IOException ioex)
  {
   throw new ApplicationException("写入数据时出现IO错误", ioex);
  }
  finally
  {
   if (conn != null) {
    try {
     conn.close();
    }
    catch(SQLException sqlex2)
    {
     System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连?" + sqlex2.toString());
    }
   }
   if (out != null){
    try {
     out.close();
    }
    catch(IOException ioex2)
    {
     System.err(this.getClass().getName() + ".mymethod - 不能关闭输出文g" + ioex2.toString());
    }
   }
  }




本文的结Z是放之四L准的教条Q有时常识和l验才是最好的老师。如果你对自q做法没有癑ֈ之百的信心,务必加上详细、全面的注释?

一斚wQ不要笑话这些错误,不妨问问你自己是否真地彻底摆׃q些坏习惯。即使最有经验的E序员偶也会误入歧途,原因很简单,因ؓ它们确实实带来了“方侎쀝。所有这些反例都可以看作Java~程世界的恶,它们丽动hQ无孔不入,时刻诱惑着你。也许有Z认ؓq些都属于鸡皮蒜毛的事Q不x齿,但请CQ勿以恶而ؓ之,勿以善小而不为?

luckyrobbie 2006-03-27 10:17 发表评论
]]>
JSP彩色验证?/title><link>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37552.html</link><dc:creator>luckyrobbie</dc:creator><author>luckyrobbie</author><pubDate>Mon, 27 Mar 2006 02:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37552.html</guid><wfw:comment>http://www.aygfsteel.com/luckyrobbie/comments/37552.html</wfw:comment><comments>http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/luckyrobbie/comments/commentRss/37552.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/luckyrobbie/services/trackbacks/37552.html</trackback:ping><description><![CDATA[ <div> <div> <h2> <font face="Arial" size="3">JSP彩色验证?/font> </h2> <a > <u> <font face="Arial" color="#0000ff">xiaohanne</font> </u> </a> <font face="Arial"> 发表?004-06-01 作?xiaohanne 评h:13/6 评论?5 点击?5229 [</font> <a > <u> <font face="Arial" color="#0000ff">收藏</font> </u> </a> <font face="Arial">] </font> </div> <div> <div> <font face="Arial"> </font> </div> <div> <font face="Arial">摘要Q?br /><br /><br /><br />本文Matrix怹镜像Q?/font> <a > <u> <font face="Arial" color="#0000ff">http://www.matrix.org.cn/resource/article/0/910.html</font> </u> </a> <font face="Arial"> <br />说明Q本文可能由Matrix原创Q也可能由Matrix的会员整理,或者由<br />Matrix的Crawler在全球知名Java或者其他技术相关站Ҏ取ƈ怹<br />保留镜像QMatrix会保留所有原来的出处URLQƈ在显著地方作明,<br />如果你发觉出处URL有误Q请联系MatrixҎ.<br /></font> </div> </div> <div> <font face="Arial">生成?个随机数字和杂ؕ背景的图片,数字和背景颜色会改变Q服务器端刷斎ͼ用history.go(-1)也会变)<br />原型参考ALIBABA  </font> <a > <u> <font face="Arial" color="#800080">http://china.alibaba.com/member/showimage</font> </u> </a> <br /> <br /> <font face="Arial">------------产生验证码图片的文g-----image.jsp-------------------------------------------<br /><br /><%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %><br /><%!<br />Color getRandColor(int fc,int bc){//l定范围获得随机颜色<br />        Random random = new Random();<br />        if(fc>255) fc=255;<br />        if(bc>255) bc=255;<br />        int r=fc+random.nextInt(bc-fc);<br />        int g=fc+random.nextInt(bc-fc);<br />        int b=fc+random.nextInt(bc-fc);<br />        return new Color(r,g,b);<br />        }<br />%><br /><%<br />//讄面不缓?br />response.setHeader("Pragma","No-cache");<br />response.setHeader("Cache-Control","no-cache");<br />response.setDateHeader("Expires", 0);<br /><br />// 在内存中创徏图象<br />int width=60, height=20;<br />BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);<br /><br />// 获取囑Ş上下?br />Graphics g = image.getGraphics();<br /><br />//生成随机c?br />Random random = new Random();<br /><br />// 讑֮背景?br />g.setColor(getRandColor(200,250));<br />g.fillRect(0, 0, width, height);<br /><br />//讑֮字体<br />g.setFont(new Font("Times New Roman",Font.PLAIN,18));<br /><br />//画边?br />//g.setColor(new Color());<br />//g.drawRect(0,0,width-1,height-1);<br /><br /><br />// 随机产生155条干扰线Q图象中的认证码不易被其它E序探测?br />g.setColor(getRandColor(160,200));<br />for (int i=0;i<155;i++)<br />{<br />        int x = random.nextInt(width);<br />        int y = random.nextInt(height);<br />        int xl = random.nextInt(12);<br />        int yl = random.nextInt(12);<br />        g.drawLine(x,y,x+xl,y+yl);<br />}<br /><br />// 取随Z生的认证?4位数?<br />String sRand="";<br />for (int i=0;i<4;i++){<br />    String rand=String.valueOf(random.nextInt(10));<br />    sRand+=rand;<br />    // 认证码昄到图象中<br />    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近Q所以只能直接生?br />    g.drawString(rand,13*i+6,16);<br />}<br /><br />// 认证码存入SESSION<br />session.setAttribute("rand",sRand);<br /><br /><br />// 图象生效<br />g.dispose();<br /><br />// 输出图象到页?br />ImageIO.write(image, "JPEG", response.getOutputStream());<br /><br /><br />%> <br /><br />---------------使用验证码图片的文g---------a.jsp------------------------------------<br /><br /><%@ page contentType="text/html;charset=gb2312" %><br /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><html><br /><head><br /><title>认证码输入页?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><body><br /><form method=post action="check.jsp"><br /><table><br /><tr><br /><td align=left>pȝ产生的认证码Q?lt;/td><br /><td><img border=0 src="image.jsp"></td><br /></tr><br /><tr><br /><td align=left>输入上面的认证码Q?lt;/td><br /><td><input type=text name=rand maxlength=4 value=""></td><br /></tr><br /><tr><br /><td colspan=2 align=center><input type=submit value="提交?></td><br /></tr><br /></form><br /></body><br /></html><br /><br />-----------------验证的页?---------check.jsp<br /><br /><%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %><br /><html><br /><head><br /><title>认证码验证页?lt;/title><br /><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><br /><META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"> <br /><META HTTP-EQUIV="Expires" CONTENT="0"> <br /></head><br /><br /><body><br /><% <br />String rand = (String)session.getAttribute("rand");<br />String input = request.getParameter("rand");<br />%><br />pȝ产生的认证码为: <%= rand %><br><br />您输入的认证码ؓQ?<%= input %><br><br /><br><br /><%<br />  if (rand.equals(input)) {<br />%><br /><font color=green>输入相同Q认证成功!</font><br /><%<br />  } else {<br />%><br /><font color=red>输入不同Q认证失败!</font><br /><%<br />  }<br />%><br /></body><br /></html><br /></font> </div> </div> <img src ="http://www.aygfsteel.com/luckyrobbie/aggbug/37552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/luckyrobbie/" target="_blank">luckyrobbie</a> 2006-03-27 10:13 <a href="http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我以前的一个ant, 用于以后copyhttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37550.htmlluckyrobbieluckyrobbieMon, 27 Mar 2006 02:07:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37550.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/37550.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37550.html#Feedback0http://www.aygfsteel.com/luckyrobbie/comments/commentRss/37550.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/37550.html 自己的build.xml 
<?xml version="1.0" encoding="gb2312"?>
<project name="app" default="build" basedir=".">
 <property name="app.name" value="hello-ant"/>
     <property name="app.jar" value="${app.name}.jar"/>
     <property name="app.copyright" value=" Copyright (c) 2005 The Robbie's Software Foundation.  All rights reserved."/>

 <property name="src.dir" location="src"/>
 <property name="build.dir" location="build"/>
 <property name="build.docs" value="${build.dir}/docs"/>
 <property name="build.docs.api" value="${build.docs}/api"/>
 <property name="dist.dir" location="dist"/>
 <property name="lib.dir" location="lib"/>
 <property environment="env"/> <!--取系l环境变?->
 
 <path id="myclasspath">
  <fileset dir="${lib.dir}">
   <include name="**/*.jar"/>
  </fileset>
  <fileset dir="${env.STRUTS_HOME}">
   <include name="lib/*.jar"/>
  </fileset>
<!--
pathelement只能d单个的jar文g, 没有fileset方便
  <pathelement path="${env.STRUTS_HOME}/lib/struts.jar"/>
-->  
 </path>
 
 <target name="init" depends="clean">
  <echo message="初始?.."/>
  <mkdir dir="${build.dir}"/>
 </target>
 
 <target name="build" depends="init">
  <echo message="~译?.."/>
  <javac srcdir="${src.dir}" destdir="${build.dir}" verbose="true">
   <classpath refid="myclasspath"/>
 
  <compilerarg value="-Xlint:all"/> <!--|上找了半天才找到的, 用于djavac的编译参?->
  </javac>
 </target>
 
 <target name="clean">
  <echo message="清理?.."/>
  <delete dir="${build.dir}"/>
  <delete dir="${dist.dir}"/>
 </target>
 
 <target name="dist" depends="build">
  <echo message="制作jar..."/>
  <tstamp/>
  <mkdir dir="${dist.dir}"/>
  <jar destfile="${dist.dir}/app-${DSTAMP}${TSTAMP}.jar" basedir="${build.dir}"/>  
 </target>
 
 <target name="javadocs" depends="dist">
  <echo message="制作api手册..."/>
  <mkdir dir="${build.docs.api}"/>
         <javadoc packagenames="tax.*"
                   sourcepath="${src.dir}"
                   defaultexcludes="yes"
                   destdir="${build.docs.api}"
                   author="true"
                   version="true"
                   use="true"
                   windowtitle="Docs API">
               <doctitle><![CDATA[<h1>tax struts ant API Docs</h1>]]></doctitle>
               <bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>
        </javadoc>
     </target>
</project>

 
 
 
 
 
 
 
 
 
 

 别h的build.xml
 
<?xml version="1.0"  encoding="GB2312" ?>
<!--
    =======================================================================
      hello-ant 目 ,学习ant工具的第2个build file.
      参照ant的jakarta-ant-1.6alpha的build.xml
      Copyright (c) 2002 The Neusoft Software Foundation.  All rights
      reserved.
    =======================================================================
-->
<project default="dist" basedir=".">
<!--
    ===================================================================
      定义属性(property tasksQ?br />      最好把用到的\径呀Q名U呀都在q里定义成全局变量
      例:定义
          <property name="a" value="hello"/>
      以后可以这L它:
          <property name="b" value="${a}/b"/>
      现在:b=="hello/b"
    ===================================================================
-->
    <!--主要的系l环境属?->
    <property environment="env"/><!--取window,unix...的环境变?->
    <property name="java.home" value="${env.JAVA_HOME}"/>
    <property name="ant.home"  value="${env.ANT_HOME}"/>
    <!--主要的app环境属?->
    <property name="app.name"      value="hello-ant"/>
    <property name="app.jar"       value="${app.name}.jar"/>
    <property name="app.copyright" value=" Copyright (c) 2002 The Neusoft Software Foundation.  All rights reserved."/>

    <!--app中src的属?->
    <property name="src.dir"    value="src" />
    <property name="src.main"   value="${src.dir}/main"/>
    <property name="src.script" value="${src.dir}/script"/>
    <!--app用到的lib-->
    <property name="lib.dir" value="lib"/>
    <!--app的build目录?->
    <property name="build.dir"      value="build" />
    <property name="build.classes"  value="${build.dir}/classes"/>
    <property name="build.docs"     value="${build.dir}/docs"/>
    <property name="build.docs.api" value="${build.docs}/api"/>
    <property name="build.lib"      value="${build.dir}/lib"/>
    <!--app的dist (distribution) 目录?->
    <property name="dist.dir"      value="dist"/>
    <property name="dist.bin"      value="${dist.dir}/bin"/>
    <property name="dist.docs"     value="${dist.dir}/docs"/>
    <property name="dist.lib"      value="${dist.dir}/lib"/>
    <!--app的docs目录?->
    <property name="docs.dir"      value="docs"/>
    <!--
    定义一l\径以后可以通过id重用q组路径 Q例Q?br />    <javac srcdir="src/main" destdir="build/classes">
            <classpath refid="classpath"/>
    </javac>
    -->
    <path id="classpath">
        <!--本项目只有一个javaQ用不上classpathQ这里只是做个例?->
        <pathelement location="${build.classes}"/>
        <pathelement path="${java.home}/lib/tools.jar"/>
    </path>
<!--
    ===================================================================
      init 准备目录(File Tasks)
      主要的目录结构通常是不会变的,一L成他?br />    ===================================================================
-->
    <target name="init">
        <!--清除以前目录-->
        <delete dir="${build.dir}" failonerror="false" />
        <delete dir="${dist.dir}"  failonerror="false"/>
        <!--准备目录-->
        <mkdir dir="${build.dir}"/>
        <mkdir dir="${build.classes}"/>
        <mkdir dir="${build.docs}"/>
        <mkdir dir="${build.docs.api}"/>
        <mkdir dir="${build.lib}"/>
        <mkdir dir="${dist.dir}"/>
        <mkdir dir="${dist.bin}"/>
        <mkdir dir="${dist.lib}"/>
    </target>
<!--
    ===================================================================
      Build the code (Compile Tasks,File Tasks)
    ===================================================================
-->
    <target name="build" depends="init">
        <!--~译-->
        <javac srcdir="${src.main}" destdir="${build.classes}">
            <classpath refid="classpath"/>
        </javac>
    </target>
<!--
    ===================================================================
      打包文档(Archive Tasks)
      Create the project jars: xxx1.jar and xxx2.jar
    ===================================================================
-->
   <target name="jars" depends="build">
        <jar basedir="${build.classes}" jarfile="${build.lib}/${app.jar}"/>
    </target>
<!--
     ===================================================================
       Creates the API documentation
     ===================================================================
-->
    <target name="javadocs"
            depends="jars"
            description="--> creates the API documentation">
        <!--copy docs 手册... -->
        <copy todir="${build.docs}">
            <fileset dir="${docs.dir}"/>
        </copy>
        <javadoc packagenames="hello.ant.*"
                 sourcepath="${src.main}"
                 defaultexcludes="yes"
                 destdir="${build.docs.api}"
                 author="true"
                 version="true"
                 use="true"
                 windowtitle="Docs API">
             <doctitle><![CDATA[<h1>hello ant Docs API</h1>]]></doctitle>
             <bottom><![CDATA[<i>${app.copyright}</i>]]></bottom>
             <tag name="todo" scope="all" description="To do:" />
         </javadoc>
    </target>
<!--
     ===================================================================
       Create the distribution that can run (Archive Tasks)
       主要是从各目录中把该copy的copy?br />     ===================================================================
-->
   <target name="dist" depends="javadocs">
        <!--copy bin 执行文g -->
        <copy todir="${dist.bin}">
            <fileset dir="${src.script}/"/>
        </copy>
        <copy todir="${dist.docs}">
            <fileset dir="${build.docs}/"/>
        </copy>
        <!-- copy lib 文g -->
        <copy todir="${dist.lib}">
            <fileset dir="${build.lib}/"/>
        </copy>
    </target>
<!--
     ===================================================================
      Cleans everything(File Tasks)
      例如可以删除build中的文gQ留l你发挥?br />     ===================================================================
-->
</project>


luckyrobbie 2006-03-27 10:07 发表评论
]]>
struts中<html:messagesQ标{使用http://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37548.htmlluckyrobbieluckyrobbieMon, 27 Mar 2006 02:02:00 GMThttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37548.htmlhttp://www.aygfsteel.com/luckyrobbie/comments/37548.htmlhttp://www.aygfsteel.com/luckyrobbie/archive/2006/03/27/37548.html#Feedback4http://www.aygfsteel.com/luckyrobbie/comments/commentRss/37548.htmlhttp://www.aygfsteel.com/luckyrobbie/services/trackbacks/37548.html Action中的代码:
ActionMessages actionMessages=new ActionMessages();
actionMessages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("......"));
saveMessages(request, actionMessages);
 
对应的jsp?
<html:messages id="message" message="true">
      <bean:write name="message"/>
</html:messages>
  • name : 指定ActionMessages存放在request或者session内的属性key.
  • message: 指定消息的来? 如果为true, 对应于key=Globals.MESSAGE_KEY的ActionMessages对象, 此时name属性无效;如果为false, 则根据name属性检索ActionMessages对象, 如果没有讄name, 默认为Globals.ERROR_KEY. message属性的默认gؓfalse.


luckyrobbie 2006-03-27 10:02 发表评论
]]>
վ֩ģ壺 ̩| ɣֲ| | | ٽ| Ϫ| | | ζ| | ̫| °| | | ʩ| ͤ| ԫ| | | ݸ| ŷ| | | | °Ͷ| ԭ| | | ˮ| | ʯ| Ƶ| ͨ| Ϻӿ| ֦| | | | ԭ| | |