﻿<?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-积少成多-随笔分类-Java</title><link>http://www.blogjava.net/ilovebabyfat/category/48843.html</link><description>垃圾堆</description><language>zh-cn</language><lastBuildDate>Wed, 25 Apr 2012 02:37:28 GMT</lastBuildDate><pubDate>Wed, 25 Apr 2012 02:37:28 GMT</pubDate><ttl>60</ttl><item><title>Eclipse插件</title><link>http://www.blogjava.net/ilovebabyfat/archive/2012/02/20/370345.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Mon, 20 Feb 2012 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2012/02/20/370345.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/370345.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2012/02/20/370345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/370345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/370345.html</trackback:ping><description><![CDATA[<div>1. http://download.eclipse.org/windowbuilder/WB/integration/3.7/<br />1.http://code.google.com/p/visualswing4eclipse/<br />2个用于J2SE swing之类的桌面编程。<br /><br />2. doxygen&nbsp;&nbsp;&nbsp; http://www.stack.nl/~dimitri/doxygen/<br />能根据项目的源文件，自动生成比较完整的文档，包括类层次图<br />3. open explorer&nbsp;&nbsp; http://blog.samsonis.me/2009/02/open-explorer-plugin-for-eclipse/<br />可以在eclipse中比较方便的打开本地文件夹</div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/370345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2012-02-20 14:25 <a href="http://www.blogjava.net/ilovebabyfat/archive/2012/02/20/370345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IE长时间等待服务器响应，显示页面无法显示的问题</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Sun, 07 Aug 2011 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/355967.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/355967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/355967.html</trackback:ping><description><![CDATA[项目通过JASPER跑报表，有几个报表牵涉的数据量比较大，导致响应时间超过1个小时，此时页面会提示&#8220;页面无法显示&#8221;。<br />开始以为是session的超时，于是在页面中添加了ajax去定期发送请求给服务器的代码来维持session， 问题无法解决。<br />然后以为是页面缓存的问题，在请求中加了随机的数字，查看每次请求回来的响应头状态都是200的，问题仍旧无法解决。<br />继续百度，继续谷歌。<br />搜索到microsoft的一篇文章，如下<br /><div><a href="http://support.microsoft.com/kb/181050">http://support.microsoft.com/kb/181050</a>&nbsp;<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; line-height: normal; background-color: #ffffff; "><h1 class="title" style="box-sizing: border-box; font-size: 19px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; ">Internet Explorer error "connection timed out" when server does not respond<br /><span class="Apple-style-span" style="font-weight: normal; font-size: 12pt; ">问题得到解决。<br />其实可以说问题无法得到解决。我怎么可能让每个用户去修改他们的注册表么。<br /><br />看来只能采取异步的请求方式了。</span></h1></span></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/355967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-08-07 22:12 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/08/07/355967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA to JSON 避免循环引用造成死循环</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/07/20/354719.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Wed, 20 Jul 2011 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/07/20/354719.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/354719.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/07/20/354719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/354719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/354719.html</trackback:ping><description><![CDATA[<div> <div style="position: relative; padding: 0px 3px; clear: both;" id="Normalcontent"> <div style="margin-left: 12px;" id="imcontent"><span> <div style="direction: ltr; color: #000000; font-size: 9pt;"> <div>JsonConfig config = new JsonConfig();<br />&nbsp;&nbsp;config.setJsonPropertyFilter(new  PropertyFilter() {<br />&nbsp;&nbsp;&nbsp;public boolean apply(Object source, String name, Object  value) {<br />&nbsp;&nbsp;&nbsp;&nbsp;if (name.equals("form") || name.equals("formElm")&nbsp;&nbsp; )  {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return  false;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;});<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;JSONObject jsonObject =  JSONObject.fromObject( form, config );</div></div></span></div></div></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/354719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-07-20 16:14 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/07/20/354719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Actuate使用总结</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Wed, 29 Jun 2011 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353346.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353346.html</trackback:ping><description><![CDATA[<div>  <p>Actuate <span style="font-family: SimSun;">简单报表的建立过程</span></p>  <p style="text-indent: -0.25in;"><span>1． </span><span style="font-family: SimSun;">1. 打开</span> e.report <span style="font-family: SimSun;">选择</span>new report</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_1.JPG" alt="" width="294" border="0" height="114" /><br /></p>  <p style="text-indent: -0.25in;"><span>2． </span><span style="font-family: SimSun;">2.选择空白报表</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_2.JPG" alt="" width="295" border="0" height="114" /><br /></p>  <p style="text-indent: -0.25in;"><span>3． </span><span style="font-family: SimSun;">3. 建立数据库连接。</span>Tools<span style="font-family: Wingdings;">&#224;</span> Database Connection</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_3.JPG" alt="" width="296" border="0" height="119" /><br /></p>  <p style="text-indent: -0.25in;"><span>4． </span><span style="font-family: SimSun;">4. 填写参数</span> </p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_4.JPG" alt="" width="296" border="0" height="119" /><br /></p>  <p style="text-indent: -0.25in;"><span>5． </span><span style="font-family: SimSun;">5. 双击</span>datasource , <span style="font-family: SimSun;">填写查询参数</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_5.JPG" alt="" width="296" border="0" height="136" /><br /></p>  <p style="text-indent: -0.25in;"><span>6． </span><span style="font-family: SimSun;">6. 选中</span>Content, Tool--〉<span style="font-family: Wingdings;"></span> Grouping, <span style="font-family: SimSun;">设置整个报表的</span>group<span style="font-family: SimSun;">，</span>1<span style="font-family: SimSun;">层</span>or n<span style="font-family: SimSun;">层。</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_6.JPG" alt="" width="280" border="0" height="166" /><br /></p>  <p style="text-indent: -0.25in;"><span>7． </span><span style="font-family: SimSun;">7. 单击</span>grouping option,<span style="font-family: SimSun;">设置</span>group<span style="font-family: SimSun;">的显示，是否需要</span>befer,after<span style="font-family: SimSun;">等，每个</span>group<span style="font-family: SimSun;">需要单独设置。</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_7.JPG" alt="" width="211" border="0" height="109" /><br /></p>  <p style="text-indent: -0.25in;"><span>8．&nbsp; </span><span style="font-family: SimSun;">8. 设置各种页面的控件</span></p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/o_8.JPG" alt="" width="291" border="0" height="221" /><br /></p>  <p style="text-indent: -0.25in;"><span>9． </span><span style="font-family: SimSun;">9. 设置参数，这些参数可以用在报表控制上或是查询的参数</span>Tools <span style="font-family: Wingdings;">--</span> Parameters</p>  <p><img src="http://www.blogjava.net/images/blogjava_net/ilovebabyfat/48970/t_9.JPG" alt="" width="120" border="0" height="102" /><br /></p>  <p style="text-indent: -0.25in;"><span><span><span style="font: 7pt &quot;Times New Roman&quot;;"></span></span></span><span style="font-family: SimSun;">修改后的查询字段</span></p>  <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">select</span><span style="color: #000000;">&nbsp;fund_id,fund_name,fund_abbreviation,fund_mode,rule_id&nbsp;</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;te_fund&nbsp;</span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;fund_mode</span><span style="color: #808080;">=</span><span style="color: #000000;">:fundmode</span></div>  <p style="text-indent: -0.25in;"><span><span></span></span><span style="font-family: SimSun;">参数10. 用来控制页面显示</span></p>  <p><span style="font-family: SimSun;">已</span>label<span style="font-family: SimSun;">为例子，重写</span>OnRow<span style="font-family: SimSun;">方法</span></p>  <p style="margin-bottom: 0.0001pt; line-height: normal;"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;&nbsp;&nbsp; <br /></span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">Sub</span><span style="color: #000000;">&nbsp;OnRow(&nbsp;row&nbsp;</span><span style="color: #0000ff;">As</span><span style="color: #000000;">&nbsp;AcDataRow&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;Super::OnRow(&nbsp;row&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;fundmode</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">M</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Manual&nbsp;Fund&nbsp;Name</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Auto&nbsp;Fund&nbsp;Name</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">end</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">End&nbsp;Sub</span></div><p style="margin-bottom: 0.0001pt; line-height: normal;"></p><p style="text-indent: -0.25in;"><span><span>11. </span></span><span style="font-family: SimSun;">用</span>datasource<span style="font-family: SimSun;">中的数据控制页面</span></p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">Sub</span><span style="color: #000000;">&nbsp;OnRow(&nbsp;row&nbsp;</span><span style="color: #0000ff;">As</span><span style="color: #000000;">&nbsp;AcDataRow&nbsp;)<br />&nbsp;Super::OnRow(&nbsp;row&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">If</span><span style="color: #000000;">&nbsp;row.GetValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">DR_SHORT_FLAG</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">BUY&nbsp;BACK</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">ElseIf</span><span style="color: #000000;">&nbsp;row.GetValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">DR_SHORT_FLAG</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">Then</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;me.Text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Sell&nbsp;to&nbsp;Open</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">End</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">End&nbsp;Sub</span></div><p>&nbsp;</p>  </div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-29 13:28 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/29/353346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)J2EE项目异常处理</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Mon, 27 Jun 2011 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/353073.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/353073.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/353073.html</trackback:ping><description><![CDATA[<div>http://www.iteye.com/topic/72170</div><br />关于j2ee项目中异常的管理和设计。之前一直困惑于异常的处理，为什么异常分为checked和uncheck，应该遵循怎样的规则自定义异常。在j2ee项目中，处理异常需要注意什么地方。<br />[原文]<br /><div>为什么要在J2EE项目中谈异常处理呢？可能许多java初学者都想说：&#8220;异常处理不就是try&#8230;.catch&#8230;finally吗？这谁都会 啊！&#8221;。笔者在初学java时也是这样认为的。如何在一个多层的j2ee项目中定义相应的异常类？在项目中的每一层如何进行异常处理？异常何时被抛出？异 常何时被记录？异常该怎么记录？何时需要把checked Exception转化成unchecked Exception  ，何时需要把unChecked Exception转化成checked  Exception?异常是否应该呈现到前端页面？如何设计一个异常框架？本文将就这些问题进行探讨。 <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">1．&nbsp;JAVA异常处理</div> <div style="margin: 0cm 0cm 0pt 18pt;">在面向过程式的编程语言中，我们可以通过返回值来确定方法是否正常执行。比如在一个c语言编写的程序中，如果方法正确的执行则返回1.错误则返回0。在vb或delphi开发的应用程序中，出现错误时，我们就弹出一个消息框给用户。</div> <div style="margin: 0cm 0cm 0pt 18pt;">通过方法的返回值我们并不能获得错误的详细信息。可能因为方法由不同的程序员编写，当同一类错误在不同的方法出现时，返回的结果和错误信息并不一致。</div> <div style="margin: 0cm 0cm 0pt 18pt;">所以java语言采取了一个统一的异常处理机制。</div> <div style="margin: 0cm 0cm 0pt 18pt;">什么是异常？运行时发生的可被捕获和处理的错误。</div> <div style="margin: 0cm 0cm 0pt 18pt;">在java语言中，Exception是所有异常的父类。任何异常都扩 展于Exception类。Exception就相当于一个错误类型。如果要定义一个新的错误类型就扩展一个新的Exception子类。采用异常的好处 还在于可以精确的定位到导致程序出错的源代码位置,并获得详细的错误信息。</div> <div style="margin: 0cm 0cm 0pt 18pt;">Java异常处理通过五个关键字来实 现，try,catch,throw ,throws,  finally。具体的异常处理结构由try&#8230;.catch&#8230;.finally块来实现。try块存放可能出现异常的java语句，catch用来捕获发 生的异常，并对异常进行处理。Finally块用来清除程序中未释放的资源。不管理try块的代码如何返回，finally块都总是被执行。</div> <div style="margin: 0cm 0cm 0pt 18pt;">一个典型的异常处理代码</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;</span> </li><li>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException{ &nbsp;&nbsp; </li><li>String&nbsp;sql&nbsp;=&nbsp;&#8220;select&nbsp;password&nbsp;from&nbsp;userinfo&nbsp;where&nbsp;userid=&#8217;&#8221;+userId&nbsp;+&#8221;&#8217;&#8221;; &nbsp;&nbsp; </li><li>String&nbsp;password&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>Connection&nbsp;con&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>Statement&nbsp;s&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>ResultSet&nbsp;rs&nbsp;=&nbsp;null; &nbsp;&nbsp; </li><li>try{ &nbsp;&nbsp; </li><li>&nbsp;con&nbsp;=&nbsp;getConnection();//获得数据连接 &nbsp;&nbsp; </li><li>&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;rs&nbsp;=&nbsp;s.executeQuery(sql); &nbsp;&nbsp; </li><li>&nbsp;while(rs.next()){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=&nbsp;rs.getString(1); &nbsp;&nbsp; </li><li>&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;rs.close(); &nbsp;&nbsp; </li><li>&nbsp;s.close(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>Catch(SqlException&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;throw&nbsp;new&nbsp;DataAccessException(ex); &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>finally{ &nbsp;&nbsp; </li><li>&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(con&nbsp;!=&nbsp;null){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataAccessException(&#8220;关闭连接失败!&#8221;,sqlEx); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>return&nbsp;password; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">可以看出Java的异常处理机制具有的优势：</div> <div style="margin: 0cm 0cm 0pt 18pt;">给错误进行了统一的分类，通过扩展Exception类或其子类来实现。从而避免了相同的错误可能在不同的方法中具有不同的错误信息。在不同的方法中出现相同的错误时，只需要throw 相同的异常对象即可。</div> <div style="margin: 0cm 0cm 0pt 18pt;">获得更为详细的错误信息。通过异常类，可以给异常更为详细，对用户更为有用的错误信息。以便于用户进行跟踪和调试程序。</div> <div style="margin: 0cm 0cm 0pt 18pt;">把正确的返回结果与错误信息分离。降低了程序的复杂度。调用者无需要对返回结果进行更多的了解。</div> <div style="margin: 0cm 0cm 0pt 18pt;">强制调用者进行异常处理，提高程序的质量。当一个方法声明需要抛出一个异常时，那么调用者必须使用try&#8230;.catch块对异常进行处理。当然调用者也可以让异常继续往上一层抛出。</div> <div>&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">2．&nbsp;Checked 异常 还是 unChecked 异常？</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">Java异常分为两大类:checked 异常和unChecked 异常。所有继承java.lang.Exception 的异常都属于checked异常。所有继承java.lang.RuntimeException的异常都属于unChecked异常。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">当一个方法去调用一个可能抛出checked异常的方法，必须通过try&#8230;catch块对异常进行捕获进行处理或者重新抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">我们看看Connection接口的createStatement()方法的声明。</div> <div style="margin: 0cm 0cm 0pt 18pt;">public Statement createStatement() throws SQLException;</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div> <div>&nbsp;&nbsp; SQLException是checked异常。当调用createStatement方法时，java强制调用者必须对SQLException进行捕获处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getPassword(String&nbsp;userId){ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&#8230;&#8230; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> 或者</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;SQLException{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>}&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">(当然，像Connection,Satement这些资源是需要及时关闭的，这里仅是为了说明checked 异常必须强制调用者进行捕获或继续抛出)</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">unChecked异常也称为运行时异常，通常 RuntimeException都表示用户无法恢复的异常，如无法获得数据库连接，不能打开文件等。虽然用户也可以像处理checked异常一样捕获 unChecked异常。但是如果调用者并没有去捕获unChecked异常时，编译器并不会强制你那么做。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">比如一个把字符转换为整型数值的代码如下：</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>String&nbsp;str&nbsp;=&nbsp;&#8220;123&#8221;; &nbsp;&nbsp;</span> </li><li>int&nbsp;value&nbsp;=&nbsp;Integer.parseInt(str);&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">parseInt的方法签名为：</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;static&nbsp;int&nbsp;parseInt(String&nbsp;s)&nbsp;throws&nbsp;NumberFormatException&nbsp;&nbsp;</span> </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">当传入的参数不能转换成相应的整数时，将会抛出NumberFormatException。因为NumberFormatException扩展于RuntimeException，是unChecked异常。所以调用parseInt方法时无需要try&#8230;catch</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><span style="color: red;">因为java不强制调用者对unChecked异常进行捕获或往上抛 出。所以程序员总是喜欢抛出unChecked异常。或者当需要一个新的异常类时，总是习惯的从RuntimeException扩展。当你去调用它些方 法时，如果没有相应的catch块，编译器也总是让你通过,同时你也根本无需要去了解这个方法倒底会抛出什么异常。看起来这似乎倒是一个很好的办法，但是 </span>这样做却是远离了java异常处理的真实意图。并且对调用你这个类的程序员带来误导，因为调用者根本不知道需要在什么情况下处理异常。而checked异 常可以明确的告诉调用者，调用这个类需要处理什么异常。如果调用者不去处理，编译器都会提示并且是无法编译通过的。当然怎么处理是由调用者自己去决定的。</div> <div>&nbsp;</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所以Java推荐人们在应用代码中应该使用checked异常。就像我们在上节提到运用异常的好外在于可以强制调用者必须对将会产生的异常进行处理。包括在《java Tutorial》等java官方文档中都把checked异常作为标准用法。</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用checked异常，应意味着有许多的try&#8230;catch在你的代码中。当在编写和处理越来越多的try&#8230;catch块之后，许多人终于开始怀疑checked异常倒底是否应该作为标准用法了。</div> <div>甚至连大名鼎鼎的《thinking in java》的作者Bruce&nbsp;Eckel也改变了他曾经的想法。Bruce  Eckel甚至主张把unChecked异常作为标准用法。并发表文章，以试验checked异常是否应该从java中去掉。Bruce  Eckel语：&#8220;当少量代码时，checked异常无疑是十分优雅的构思，并有助于避免了许多潜在的错误。但是经验表明，对大量代码来说结果正好相反&#8221;</div> <div>关于checked异常和unChecked异常的详细讨论可以参考</div> <div style="text-indent: 15.75pt;">Alan Griffiths&nbsp;<a href="http://www.octopull.demon.co.uk/java/ExceptionalJava.html">http://www.octopull.demon.co.uk/java/ExceptionalJava.html</a> </div> <div>&nbsp;&nbsp; Bruce Eckel&nbsp;<a href="http://www.mindview.net/Etc/Disscussions/CheckedExceptions">http://www.mindView.net/Etc/Disscussions/CheckedExceptions</a></div> <div>&nbsp;&nbsp; 《java Tutorial》 <a href="http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html">http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html</a></div> <div>&nbsp;</div> <div>使用checked异常会带来许多的问题。</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checked异常导致了太多的try&#8230;catch 代码</div> <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能有很多checked异常对开发人员来说是无法合理地进行处理的，比如 SQLException。而开发人员却不得不去进行try&#8230;catch。当开发人员对一个checked异常无法正确的处理时，通常是简单的把异常打印 出来或者是干脆什么也不干。特别是对于新手来说，过多的checked异常让他感到无所适从。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlEx.PrintStackTrace(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;或者 &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//什么也不干 &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致了许多难以理解的代码产生</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当开发人员必须去捕获一个自己无法正确处理的checked异常，通常的是重新封装成一个新的异常后再抛出。这样做并没有为程序带来任何好处。反而使代码晚难以理解。</div> <div style="margin: 0cm 0cm 0pt 18pt;">就像我们使用JDBC代码那样，需要处理非常多的try&#8230;catch.，真正有用的代码被包含在try&#8230;catch之内。使得理解这个方法变理困难起来</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致异常被不断的封装成另一个类异常后再抛出</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;methodA()throws&nbsp;ExceptionA{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;void&nbsp;methodB()throws&nbsp;ExceptionB{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodA(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;}catch(ExceptionA&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionB(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Public&nbsp;void&nbsp;methodC()throws&nbsp;ExceptinC{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodB(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(ExceptionB&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionC(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li></ol></div> 我们看到异常就这样一层层无休止的被封装和重新抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">checked异常导致破坏接口方法</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;&nbsp; 一个接口上的一个方法已被多个类使用，当为这个方法额外添加一个checked异常时，那么所有调用此方法的代码都需要修改。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">可见上面这些问题都是因为调用者无法正确的处理checked异常时而被迫去捕获和处理，被迫封装后再重新抛出。这样十分不方便，并不能带来任何好处。在这种情况下通常使用unChecked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">chekced异常并不是无一是处，checked异常比传统编程的错误返回值要好用得多。通过编译器来确保正确的处理异常比通过返回值判断要好得多。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">如果一个异常是致命的，不可恢复的。或者调用者去捕获它没有任何益处，使用unChecked</strong><strong>异常。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">如果一个异常是可以恢复的，可以被调用者正确处理的，使用checked</strong><strong>异常</strong>。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">在使用unChecked</strong><strong style="color: red;">异常时，必须在在方法声明中详细的说明该方法可能会抛出的unChekced</strong><strong style="color: red;">异常。由调用者自己去决定是否捕获unChecked</strong><strong style="color: red;">异常</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">倒底什么时候使用checked异常，什么时候使用unChecked异常？并没有一个绝对的标准。但是笔者可以给出一些建议</div> <div style="margin: 0cm 0cm 0pt 18pt;">当所有调用者必须处理这个异常，可以让调用者进行重试操作；或者该异常相当于该方法的第二个返回值。使用checked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这个异常仅是少数比较高级的调用者才能处理，一般的调用者不能正确的处理。使用unchecked异常。有能力处理的调用者可以进行高级处理，一般调用者干脆就不处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这个异常是一个非常严重的错误，如数据库连接错误，文件无法打开等。或者这些异常是与外部环境相关的。不是重试可以解决的。使用unchecked异常。因为这种异常一旦出现，调用者根本无法处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果不能确定时，使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">3．<span style="font-family: 'Times New Roman';">&nbsp;</span>设计一个新的异常类</div> <div style="margin: 0cm 0cm 0pt 18pt;">在设计一个新的异常类时，首先看看是否真正的需要这个异常类。一般情况下尽量不要去设计新的异常类，而是尽量使用java中已经存在的异常类。</div> <pre>如<div>java 代码</div><div><ol><li><span>IllegalArgumentException,&nbsp;UnsupportedOperationException&nbsp;&nbsp;</span></li></ol></div></pre> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">不管是新的异常是chekced异常还是unChecked异常。我们都必须考虑异常的嵌套问题。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;void&nbsp;methodA()throws&nbsp;ExceptionA{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;..&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionA();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">方法methodA声明会抛出ExceptionA.</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">public void methodB()throws ExceptionB</div> <div style="margin: 0cm 0cm 0pt 18pt;">methodB声明会抛出ExceptionB,当在methodB方 法中调用methodA时，ExceptionA是无法处理的,所以ExceptionA应该继续往上抛出。一个办法是把methodB声明会抛出 ExceptionA.但这样已经改变了MethodB的方法签名。一旦改变，则所有调用methodB的方法都要进行改变。</div> <div style="margin: 0cm 0cm 0pt 18pt;">另一个办法是把ExceptionA封装成ExceptionB，然后再抛出。如果我们不把ExceptionA封装在ExceptionB中，就丢失了根异常信息，使得无法跟踪异常的原始出处。</div> <div style="text-indent: 15.75pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;void&nbsp;methodB()throws&nbsp;ExceptionB{ &nbsp;&nbsp;</span> </li><li>&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;methodA(); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;}catch(ExceptionA&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ExceptionB(ex); &nbsp;&nbsp; </li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp; </li><li>}&nbsp;&nbsp; </li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div>&nbsp;&nbsp; 如上面的代码中，ExceptionB嵌套一个ExceptionA.我们暂且把ExceptionA称为&#8220;起因异常&#8221;,因为ExceptionA导致了ExceptionB的产生。这样才不使异常信息丢失。</div> <div>所以我们在定义一个新的异常类时，必须提供这样一个可以包含嵌套异常的构造函数。并有一个私有成员来保存这个&#8220;起因异常&#8221;。</div> <div> <div>java 代码</div> <div><ol><li><span>public&nbsp;Class&nbsp;ExceptionB&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span> </li><li>private&nbsp;Throwable&nbsp;cause; &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(String&nbsp;msg,&nbsp;Throwable&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;super(msg); &nbsp;&nbsp; </li><li>&nbsp;this.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(String&nbsp;msg){ &nbsp;&nbsp; </li><li>&nbsp;super(msg); &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>&nbsp; &nbsp;&nbsp; </li><li>public&nbsp;ExceptionB(Throwable&nbsp;ex){ &nbsp;&nbsp; </li><li>&nbsp;this.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li><li>} &nbsp;&nbsp; </li></ol></div> 当然，我们在调用printStackTrace方法时，需要把所有的&#8220;起因异常&#8221;的信息也同时打印出来。所以我们需要覆写printStackTrace方法来显示全部的异常栈跟踪。包括嵌套异常的栈跟踪。</div> <div> <div>java 代码</div> <div><ol><li><span style="color: red;">public&nbsp;void&nbsp;printStackTrace(PrintStrean&nbsp;ps){ &nbsp;&nbsp;</span></li><li><span style="color: red;">if(cause&nbsp;==&nbsp;null){ &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;super.printStackTrace(ps); &nbsp;&nbsp;</span></li><li><span style="color: red;">}else{ &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;ps.println(this); &nbsp;&nbsp;</span></li><li><span style="color: red;">&nbsp;cause.printStackTrace(ps); &nbsp;&nbsp;</span></li><li><span style="color: red;">} &nbsp;&nbsp;</span></li><li><span style="color: red;">} &nbsp;&nbsp;</span></li></ol></div> &nbsp;</div> <div>一个完整的支持嵌套的checked异常类源码如下。我们在这里暂且把它叫做NestedException</div> <div>&nbsp;</div> <div> <div>java 代码</div> <div><ol><li><span>public&nbsp;NestedException&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>private&nbsp;Throwable&nbsp;cause; &nbsp;&nbsp;</li><li>public&nbsp;NestedException&nbsp;(String&nbsp;msg){ &nbsp;&nbsp;</li><li>&nbsp;super(msg); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;NestedException(String&nbsp;msg,&nbsp;Throwable&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;super(msg); &nbsp;&nbsp;</li><li>&nbsp;This.cause&nbsp;=&nbsp;ex; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;Throwable&nbsp;getCause(){ &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;(this.cause&nbsp;==&nbsp;null&nbsp;?&nbsp;this&nbsp;:this.cause); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;getMessage(){ &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;message&nbsp;=&nbsp;super.getMessage(); &nbsp;&nbsp;</li><li>&nbsp;Throwable&nbsp;cause&nbsp;=&nbsp;getCause(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;if(cause&nbsp;!=&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;message&nbsp;+&nbsp;&#8220;;nested&nbsp;Exception&nbsp;is&nbsp;&#8221;&nbsp;+&nbsp;cause; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;message; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(PrintStream&nbsp;ps){ &nbsp;&nbsp;</li><li>&nbsp;if(getCause&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;super.printStackTrace(ps); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li><li>&nbsp;}else{ &nbsp;&nbsp;</li><li>&nbsp;ps.println(this); &nbsp;&nbsp;</li><li>&nbsp;getCause().printStackTrace(ps); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(PrintWrite&nbsp;pw){ &nbsp;&nbsp;</li><li>&nbsp;if(getCause()&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;super.printStackTrace(pw); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;else{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;pw.println(this); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;getCause().printStackTrace(pw); &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;printStackTrace(){ &nbsp;&nbsp;</li><li>&nbsp;printStackTrace(System.error); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li></ol></div> 同样要设计一个unChecked异常类也与上面一样。只是需要继承RuntimeException。</div> <div>&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">4．<span style="font-family: 'Times New Roman';">&nbsp;</span>如何记录异常</div> <div style="margin: 0cm 0cm 0pt 18pt;">作为一个大型的应用系统都需要用日志文件来记录系统的运行，以便于跟踪和记录系统的运行情况。系统发生的异常理所当然的需要记录在日志系统中。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;NoSuchUserException{ &nbsp;&nbsp;</span></li><li>UserInfo&nbsp;user&nbsp;=&nbsp;userDao.queryUserById(userId); &nbsp;&nbsp;</li><li>If(user&nbsp;==&nbsp;null){ &nbsp;&nbsp;</li><li>&nbsp;Logger.info(&#8220;找不到该用户信息,userId=&#8221;+userId); &nbsp;&nbsp;</li><li>&nbsp;throw&nbsp;new&nbsp;NoSuchUserException(&#8220;找不到该用户信息,userId=&#8221;+userId); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>else{ &nbsp;&nbsp;</li><li>&nbsp;return&nbsp;user.getPassword(); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;void&nbsp;sendUserPassword(String&nbsp;userId)throws&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</li><li>UserInfo&nbsp;user&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;user&nbsp;=&nbsp;getPassword(userId); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;//&#8230;&#8230;.. &nbsp;&nbsp;</li><li>&nbsp;sendMail(); &nbsp;&nbsp;</li><li>&nbsp;// &nbsp;&nbsp;</li><li>}catch(NoSuchUserException&nbsp;ex)( &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;logger.error(&#8220;找不到该用户信息:&#8221;+userId+ex); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception(ex); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">我们注意到，一个错误被记录了两次.在错误的起源位置我们仅是以info级别进行记录。而在sendUserPassword方法中，我们还把整个异常信息都记录了。</div> <div style="margin: 0cm 0cm 0pt 18pt;">笔者曾看到很多项目是这样记录异常的，不管三七二一，只有遇到异常就把整个异常全部记录下。如果一个异常被不断的封装抛出多次，那么就被记录了多次。那么异常倒底该在什么地方被记录？</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>异常应该在最初产生的位置记录</strong>！</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果必须捕获一个无法正确处理的异常，仅仅是把它封装成另外一种异常往上抛出。不必再次把已经被记录过的异常再次记录。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>如果捕获到一个异常，但是这个异常是可以处理的。则无需要记录异常</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;Date&nbsp;getDate(String&nbsp;str){ &nbsp;&nbsp;</span></li><li>&nbsp;Date&nbsp;applyDate&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;applyDate&nbsp;=&nbsp;format.parse(applyDateStr); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>catch(ParseException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;//乎略，当格式错误时，返回null &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>return&nbsp;applyDate; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>捕获到一个未记录过的异常或外部系统异常时，应该记录异常的详细信息</strong></div> <div><span> <div>java 代码</div> <div><ol><li><span>try{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql=&#8221;select&nbsp;*&nbsp;from&nbsp;userinfo&#8221;; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;s&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Catch(SQLException&nbsp;sqlEx){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Logger.error(&#8220;sql执行错误&#8221;+sql+sqlEx); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></div> <div>&nbsp;&nbsp; 究竟在哪里记录异常信息，及怎么记录异常信息，可能是见仁见智的问题了。甚至有些系统让异常类一记录异常。当产生一个新异常对象时，异常信息就被自动记录。</div> <div style="text-indent: 10.5pt;"> <div>java 代码</div> <div><ol><li><span>&nbsp;&nbsp;public&nbsp;class&nbsp;BusinessException&nbsp;extends&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;logTrace()&nbsp;{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer=new&nbsp;StringBuffer(); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append("Business&nbsp;Error&nbsp;in&nbsp;Class:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(getClassName()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(",method:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(getMethodName()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(",messsage:&nbsp;"); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(this.getMessage()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(buffer.toString()); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;BusinessException(String&nbsp;s)&nbsp;{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(s); &nbsp;&nbsp;</li><li>race(); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> 这似乎看起来是十分美妙的，其实必然导致了异常被重复记录。同时违反了&#8220;类的职责分配原则&#8221;，是一种不好的设计。记录异常不属于异常类的行为，记录异常应 该由专门的日志系统去做。并且异常的记录信息是不断变化的。我们在记录异常同应该给更丰富些的信息。以利于我们能够根据异常信息找到问题的根源，以解决问 题。</div> <div style="text-indent: 10.5pt;">虽然我们对记录异常讨论了很多，过多的强调这些反而使开发人员更为疑惑，一种好的方式是为系统提供一个异常处理框架。由框架来决定是否记录异常和怎么记录异常。而不是由普通程序员去决定。但是了解些还是有益的。</div> <div style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;"><strong>5．&nbsp;J2EE项目中的异常处理</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;">目前,J2ee项目一般都会从逻辑上分为多层。比较经典的分为三层：表示层，业务层，集成层(包括数据库访问和外部系统的访问)。</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee项目有着其复杂性，J2ee项目的异常处理需要特别注意几个问题。</div> <div style="margin: 0cm 0cm 0pt 18pt;">在分布式应用时，我们会遇到许多checked异常。所有RMI调用 （包括EJB远程接口调用）都会抛出java.rmi.RemoteException;同时RemoteException是checked异常，当我 们在业务系统中进行远程调用时，我们都需要编写大量的代码来处理这些checked异常。而一旦发生RemoteException这些checked异 常对系统是非常严重的，几乎没有任何进行重试的可能。也就是说，当出现RemoteException这些可怕的checked异常，我们没有任何重试的 必要性，却必须要编写大量的try&#8230;catch代码去处理它。一般我们都是在最底层进行RMI调用，只要有一个RMI调用，所有上层的接口都会要求抛出 RemoteException异常。因为我们处理RemoteException的方式就是把它继续往上抛。这样一来就破坏了我们业务接口。 RemoteException这些J2EE系统级的异常严重的影响了我们的业务接口。我们对系统进行分层的目的就是减少系统之间的依赖，每一层的技术改 变不至于影响到其它层。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>// &nbsp;&nbsp;</span></li><li>public&nbsp;class&nbsp;UserSoaImpl&nbsp;implements&nbsp;UserSoa{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;UserInfo&nbsp;getUserInfo(String&nbsp;userId)throws&nbsp;RemoteException{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&#8230;&#8230; &nbsp;&nbsp;</li><li>远程方法调用. &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserManager{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;UserInfo&nbsp;getUserInfo(Stirng&nbsp;userId)throws&nbsp;RemoteException; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">同样JDBC访问都会抛出SQLException的checked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">为了避免系统级的checked异常对业务系统的深度侵入，我们可以为 业务方法定义一个业务系统自己的异常。针对像SQLException,RemoteException这些非常严重的异常，我们可以新定义一个 unChecked的异常，然后把SQLException，RemoteException封装成unChecked异常后抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果这个系统级的异常是要交由上一级调用者处理的，可以新定义一个checked的业务异常，然后把系统级的异常封存装成业务级的异常后再抛出。</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">一般地，我们需要定义一个unChecked</strong><strong style="color: red;">异常，让集成层接口的所有方法都声明抛出这unChecked</strong><strong style="color: red;">异常</strong><span style="color: red;">。</span></div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;DataAccessException&nbsp;extends&nbsp;RuntimeException{ &nbsp;&nbsp;</span></li><li>&nbsp;&#8230;&#8230; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserDao{ &nbsp;&nbsp;</li><li>&nbsp;public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;class&nbsp;UserDaoImpl&nbsp;implements&nbsp;UserDAO{ &nbsp;&nbsp;</li><li>public&nbsp;String&nbsp;getPassword(String&nbsp;userId)throws&nbsp;DataAccessException{ &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;sql&nbsp;=&nbsp;&#8220;select&nbsp;password&nbsp;from&nbsp;userInfo&nbsp;where&nbsp;userId=&nbsp;&#8216;&#8221;+userId+&#8221;&#8217;&#8221;; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//JDBC调用 &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.executeQuery(sql); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&#8230; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;}catch(SQLException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;DataAccessException(&#8220;数据库查询失败&#8221;+sql,ex); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong style="color: red;">定义一个checked</strong><strong style="color: red;">的业务异常，让业务层的接口的所有方法都声明抛出Checked</strong><strong style="color: red;">异常</strong><span style="color: red;">.</span></div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>public&nbsp;class&nbsp;BusinessException&nbsp;extends&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&#8230;.. &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>public&nbsp;interface&nbsp;UserManager{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;public&nbsp;Userinfo&nbsp;copyUserInfo(Userinfo&nbsp;user)throws&nbsp;BusinessException{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Userinfo&nbsp;newUser&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser&nbsp;=&nbsp;(Userinfo)user.clone(); &nbsp;&nbsp;</li><li>}catch(CloneNotSupportedException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;throw&nbsp;new&nbsp;BusinessException(&#8220;不支持clone方法:&#8221;+Userinfo.class.getName(),ex); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp;} &nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee表示层应该是一个很薄的层，主要的功能为：获得页面请求，把页 面的参数组装成POJO对象，调用相应的业务方法，然后进行页面转发，把相应的业务数据呈现给页面。表示层需要注意一个问题，表示层需要对数据的合法性进 行校验，比如某些录入域不能为空，字符长度校验等。</div> <div style="margin: 0cm 0cm 0pt 18pt;">J2ee从页面所有传给后台的参数都是字符型的，如果要求输入数值或日期类型的参数时，必须把字符值转换为相应的数值或日期值。</div> <div style="margin: 0cm 0cm 0pt 18pt;">如果表示层代码校验参数不合法时，应该返回到原始页面，让用户重新录入数据，并提示相关的错误信息。</div> <div style="margin: 0cm 0cm 0pt 18pt;">&nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">通常把一个从页面传来的参数转换为数值，我们可以看到这样的代码</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>ModeAndView&nbsp;handleRequest(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)throws&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;String&nbsp;ageStr&nbsp;=&nbsp;request.getParameter(&#8220;age&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;int&nbsp;age&nbsp;=&nbsp;Integer.parse(ageStr); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>&nbsp;String&nbsp;birthDayStr&nbsp;=&nbsp;request.getParameter(&#8220;birthDay&#8221;); &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>Date&nbsp;birthDay&nbsp;=&nbsp;format.parse(birthDayStr); &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li></ol></div> &nbsp;</div> <div style="margin: 0cm 0cm 0pt 18pt;">上面的代码应该经常见到，但是当用户从页面录入一个不能转换为整型的字符或一个错误的日期值。</div> <div style="margin: 0cm 0cm 0pt 18pt;">Integer.parse()方法被抛出一个 NumberFormatException的unChecked异常。但是这个异常绝对不是一个致命的异常,一般当用户在页面的录入域录入的值不合法 时，我们应该提示用户进行重新录入。但是一旦抛出unchecked异常，就没有重试的机会了。像这样的代码造成大量的异常信息显示到页面。使我们的系统 看起来非常的脆弱。</div> <div style="margin: 0cm 0cm 0pt 18pt;">同样，SimpleDateFormat.parse()方法也会抛出ParseException的unChecked异常。</div> <div style="margin: 0cm 0cm 0pt 18pt;">这种情况我们都应该捕获这些unChecked异常，并给提示用户重新录入。</div> <div style="margin: 0cm 0cm 0pt 18pt;"> <div>java 代码</div> <div><ol><li><span>ModeAndView&nbsp;handleRequest(HttpServletRequest&nbsp;request,HttpServletResponse&nbsp;response)throws&nbsp;Exception{ &nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;String&nbsp;ageStr&nbsp;=&nbsp;request.getParameter(&#8220;age&#8221;); &nbsp;&nbsp;</li><li>String&nbsp;birthDayStr&nbsp;=&nbsp;request.getParameter(&#8220;birthDay&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;int&nbsp;age&nbsp;=&nbsp;0; &nbsp;&nbsp;</li><li>&nbsp;Date&nbsp;birthDay&nbsp;=&nbsp;null; &nbsp;&nbsp;</li><li>try{ &nbsp;&nbsp;</li><li>age=Integer.parse(ageStr); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;}catch(NumberFormatException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error.reject(&#8220;age&#8221;,&#8221;不是合法的整数值&#8221;); &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230; &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>&nbsp;try{ &nbsp;&nbsp;</li><li>SimpleDateFormat&nbsp;format&nbsp;=&nbsp;new&nbsp;SimpleDateFormat(&#8220;MM/dd/yyyy&#8221;); &nbsp;&nbsp;</li><li>&nbsp;birthDay&nbsp;=&nbsp;format.parse(birthDayStr); &nbsp;&nbsp;</li><li>}catch(ParseException&nbsp;ex){ &nbsp;&nbsp;</li><li>&nbsp;error.reject(&#8220;birthDay&#8221;,&#8221;不是合法的日期，请录入&#8217;MM/dd/yyy&#8217;格式的日期&#8221;); &nbsp;&nbsp;</li><li>} &nbsp;&nbsp;</li><li>&nbsp; &nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>在表示层一定要弄清楚调用方法的是否会抛出unChecked</strong><strong>异常，什么情况下会抛出这些异常，并作出正确的处理。</strong></div> <div style="margin: 0cm 0cm 0pt 18pt;"><strong>在表示层调用系统的业务方法，一般情况下是无需要捕获异常的。如果调用的业务方法抛出的异常相当于第二个返回值时，在这种情况下是需要捕获</strong></div></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/353073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-27 16:02 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/27/353073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RMI 初探</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352190.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Mon, 13 Jun 2011 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352190.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/352190.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/352190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/352190.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">package&nbsp;hello;<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;interface&nbsp;Hello&nbsp;extends&nbsp;java.rmi.Remote{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sayHello()&nbsp;throws&nbsp;java.rmi.RemoteException;<br />}<br /><br />package&nbsp;hello;<br />import&nbsp;java.rmi.</span><span style="color: #808080;">*</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;class&nbsp;HelloClient&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setSecurityManager(new&nbsp;RMISecurityManager());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello&nbsp;obj&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Hello)Naming.lookup("HelloServer");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;message</span><span style="color: #808080;">=</span><span style="color: #000000;">obj.sayHello();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />package&nbsp;hello;<br />import&nbsp;java.rmi.</span><span style="color: #808080;">*</span><span style="color: #000000;">;<br />import&nbsp;java.rmi.registry.LocateRegistry;<br />import&nbsp;java.rmi.server.UnicastRemoteObject;<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;class&nbsp;HelloImpl&nbsp;extends&nbsp;UnicastRemoteObject&nbsp;implements&nbsp;Hello{<br />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;HelloImpl(String&nbsp;s)&nbsp;throws&nbsp;java.rmi.RemoteException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #808080;">=</span><span style="color: #000000;">s;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;sayHello()throws&nbsp;RemoteException{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;"hello&nbsp;world";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setSecurityManager(new&nbsp;RMISecurityManager());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloImpl&nbsp;obj&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;new&nbsp;HelloImpl("HelloServer");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocateRegistry.createRegistry(</span><span style="color: #800000; font-weight: bold;">1099</span><span style="color: #000000;">);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Naming.rebind("HelloServer",&nbsp;obj);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("HelloImpl&nbsp;created&nbsp;</span><span style="color: #808080;">and</span><span style="color: #000000;">&nbsp;bound&nbsp;</span><span style="color: #808080;">in</span><span style="color: #000000;">&nbsp;the&nbsp;registry&nbsp;</span><span style="color: #0000ff;">to</span><span style="color: #000000;">&nbsp;the&nbsp;name&nbsp;HelloServer");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}catch(Exception&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />安全策略文件<br /><div>grant {<br />&nbsp;&nbsp; &nbsp;permission java.security.AllPermission;<br />&nbsp;&nbsp; &nbsp;};</div><br />运行脚本:<br /><div>Set CLASSPATH=%CLASSPATH%;c:\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">没有空格</span></div><div>javac -d .. *.java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">在hello目录下</span></div><div>rmic -d . hello.HelloImpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">在hello的父目录下</span></div><div>java -Djava.security.policy=file:C:/java.policy hello.HelloImpl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">注意安全策略文件</span></div><div>java -Djava.security.policy=file:/C:/java.policy hello.HelloClient&nbsp;&nbsp; &nbsp; <span style="color: red;">注意</span><span style="color: red;">安全策略文件</span><br /><br />相关资料：<br /><div><span style="color: #0000ff;">http://blog.csdn.net/coolriver/archive/2004/09/10/100702.aspx</span><br /><div><span style="color: #0000ff;">http://topic.csdn.net/t/20020310/12/566253.html</span><br /><div><span style="color: #0000ff;">http://topic.csdn.net/u/20070426/08/b852e323-08c6-4f80-b87a-937e24af237d.html</span></div></div></div></div><br /></span></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/352190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-13 15:18 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaBean和BeanUtils</title><link>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352181.html</link><dc:creator>思无</dc:creator><author>思无</author><pubDate>Mon, 13 Jun 2011 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352181.html</guid><wfw:comment>http://www.blogjava.net/ilovebabyfat/comments/352181.html</wfw:comment><comments>http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ilovebabyfat/comments/commentRss/352181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ilovebabyfat/services/trackbacks/352181.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />&nbsp;*&nbsp;改类掩饰了如何通过java.bean的类去获知bean中的属性并调用相应的set&nbsp;get方法<br />&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.beans.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.reflect.Method;<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;JavaBeanInvoke&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;args[])</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test1();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test1()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanInfo&nbsp;beaninfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Introspector.getBeanInfo(Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor[]&nbsp;porpertydescriptors&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;beaninfo.getPropertyDescriptors();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(PropertyDescriptor&nbsp;pd:porpertydescriptors){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(pd.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pd.getName().endsWith(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;setMethod</span><span style="color: #000000;">=</span><span style="color: #000000;">pd.getWriteMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getMethod</span><span style="color: #000000;">=</span><span style="color: #000000;">pd.getReadMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMethod.invoke(person,</span><span style="color: #000000;">"</span><span style="color: #000000;">ShenZiping</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(getMethod.invoke(person));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test2()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">.newInstance();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor&nbsp;pd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PropertyDescriptor(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,Person.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;setMethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pd.getWriteMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;getMethod&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pd.getReadMethod();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMethod.invoke(person,&nbsp;</span><span style="color: #000000;">56</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(getMethod.invoke(person));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />&nbsp;*&nbsp;代码举例了beanUtil包的普遍用法，需要apache的logging包和beanUtils包<br />&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.text.ParseException;<br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.text.SimpleDateFormat;<br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Date;<br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.HashMap;<br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br /><br /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.apache.commons.beanutils.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;BeanUtilsInvoke&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String&nbsp;args[])</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test2();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test3();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test4();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myConvertTest();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test1()</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperty(person,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ShenZiping</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test1<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">person.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test2()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;map&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ShenZiping</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">65</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.populate(person,&nbsp;map);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test2<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">person.getAge());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test2<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">person.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test3()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;p2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.setAge(</span><span style="color: #000000;">98</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">ShenZiping</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperties(p2,&nbsp;p1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test3<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">p2.getAge());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test3<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">p2.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;test4()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person&nbsp;person&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Person();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Man&nbsp;man&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Man();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;person.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">ShenZiping</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanUtils.copyProperties(man,&nbsp;person);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">test4<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">man.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;myConvertTest(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConvertUtils.register(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Converter(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;convert(Class&nbsp;clazz,&nbsp;Object&nbsp;value){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(clazz</span><span style="color: #000000;">==</span><span style="color: #000000;">Date.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;dateFormat&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SimpleDateFormat(</span><span style="color: #000000;">"</span><span style="color: #000000;">yyyy-MM-dd</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;dateFormat.parse((String)value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(ParseException&nbsp;e){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">invalid&nbsp;format</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;Date.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Date)ConvertUtils.convert(</span><span style="color: #000000;">"</span><span style="color: #000000;">2010-01-15</span><span style="color: #000000;">"</span><span style="color: #000000;">,Date.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">myConvertTest<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">date);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div></div><img src ="http://www.blogjava.net/ilovebabyfat/aggbug/352181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ilovebabyfat/" target="_blank">思无</a> 2011-06-13 12:38 <a href="http://www.blogjava.net/ilovebabyfat/archive/2011/06/13/352181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>