﻿<?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-自由飞翔-随笔分类-corejava</title><link>http://www.blogjava.net/GavinMiao/category/49312.html</link><description>我在仰望，java之上</description><language>zh-cn</language><lastBuildDate>Wed, 11 Sep 2019 16:35:25 GMT</lastBuildDate><pubDate>Wed, 11 Sep 2019 16:35:25 GMT</pubDate><ttl>60</ttl><item><title>编码至高法则-高内聚低耦合</title><link>http://www.blogjava.net/GavinMiao/archive/2019/09/11/434613.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Wed, 11 Sep 2019 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2019/09/11/434613.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/434613.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2019/09/11/434613.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/434613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/434613.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 此法则适合所有语言，咱们以JavaScript和Java两个角度分析一下这个东东。  一、javascript  有这样的一个页面，js、css代码都写在html页面中。  例如：gnj.html  v1版本Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-...&nbsp;&nbsp;<a href='http://www.blogjava.net/GavinMiao/archive/2019/09/11/434613.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/434613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2019-09-11 15:59 <a href="http://www.blogjava.net/GavinMiao/archive/2019/09/11/434613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jgoodies FormLayout 小结</title><link>http://www.blogjava.net/GavinMiao/archive/2012/09/29/388827.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Sat, 29 Sep 2012 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/09/29/388827.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/388827.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/09/29/388827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/388827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/388827.html</trackback:ping><description><![CDATA[<br />一、列与行的参数都由三个部分组成：对齐方式、固定尺寸、调整方式。 <br />1.对齐方式：<br />1）列对齐有left, center, right, fill.默认fill<br />2）行对齐有：top, center, bottom, fill. 其中fill表示填充至整个区域。默认center。<br />2.固定尺寸：<br />pref表示preferred size，适当大小，即首选尺寸大小。<br />min表示minimum size，<br />dlu 表示dialog units，<br />px, pt, in, mm, cm）分别表示Pixel, Points, Inches, Millimeter, Centimeter。<br />3.&nbsp;调整方式:<br />二、CellConstraints：<br />cc.xywh(3, 1, 3, 1)：表示3列，1行，colspan=3，rowspan=1<br />三、FormLayout：<br />&nbsp;&nbsp;1.FormLayout layout = new FormLayout(<br />&nbsp;&nbsp;&nbsp;new ColumnSpec[]{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_COLSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_COLSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_COLSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_COLSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_COLSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_COLSPEC},<br />&nbsp;&nbsp;&nbsp;new RowSpec[]{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_ROWSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_ROWSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_ROWSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_ROWSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.DEFAULT_ROWSPEC,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FormSpecs.GLUE_ROWSPEC<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;);<br />2.<br />
<p>FormLayout&nbsp;layout&nbsp;=&nbsp;new&nbsp;FormLayout(&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"right:pref,&nbsp;6dlu,&nbsp;50dlu,&nbsp;4dlu,&nbsp;center:50dlu",&nbsp;//&nbsp;columns<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"pref,&nbsp;3dlu,&nbsp;pref,&nbsp;3dlu,&nbsp;pref");&nbsp;//&nbsp;rows &nbsp;&nbsp;</p><br /><br /><br /><br />参考文章：<br /><a href="http://hi.baidu.com/lijunwyf/item/a18d95f719ff01da6225d26f">http://hi.baidu.com/lijunwyf/item/a18d95f719ff01da6225d26f</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/388827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-09-29 11:29 <a href="http://www.blogjava.net/GavinMiao/archive/2012/09/29/388827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vector浅见</title><link>http://www.blogjava.net/GavinMiao/archive/2012/09/24/388406.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 24 Sep 2012 00:49:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/09/24/388406.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/388406.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/09/24/388406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/388406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/388406.html</trackback:ping><description><![CDATA[<div>例子：<br />import java.util.*;<br />public class TestVector{<br />&nbsp;public static void main(String[] args){<br />&nbsp;&nbsp;Vector v = new Vector();<br />&nbsp;&nbsp;v.add(null);<br />&nbsp;&nbsp;v.add(new Integer(1));<br />&nbsp;&nbsp;v.add("123");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(Enumeration e = v.elements();e.hasMoreElements();){<br />&nbsp;&nbsp;&nbsp;System.out.println(e.nextElement());<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;v.insertElementAt("insert",2);<br />&nbsp;&nbsp;v.setElementAt("insert",0);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(Enumeration e = v.elements();e.hasMoreElements();){<br />&nbsp;&nbsp;&nbsp;System.out.println(e.nextElement());<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;<br />&nbsp;}<br />}<br /><br />结果：<br />null<br />1<br />123<br /></div>
<div><br />insert<br />1<br />insert<br />123<br />&nbsp;</div>
<div>结论：<br />vector中可以放入null；<br />vector可以放入不同类型的对象；<br />vector是同步的容量自增长的向量；<br /></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/388406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-09-24 08:49 <a href="http://www.blogjava.net/GavinMiao/archive/2012/09/24/388406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String面试题</title><link>http://www.blogjava.net/GavinMiao/archive/2012/04/06/373497.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 06 Apr 2012 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/04/06/373497.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/373497.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/04/06/373497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/373497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/373497.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2012/04/06/373497.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/373497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-04-06 18:26 <a href="http://www.blogjava.net/GavinMiao/archive/2012/04/06/373497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ftp-java实现</title><link>http://www.blogjava.net/GavinMiao/archive/2012/03/26/372732.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 26 Mar 2012 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/03/26/372732.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/372732.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/03/26/372732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/372732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/372732.html</trackback:ping><description><![CDATA[一、利用框架：<br />1.jre下的rt.jar中sun.net.ftpClient<br />2.common net 中的ftp包<br />二、ftp协议认识：<br />参考规范：RFC 959<br />1.文件传输协议：file transfer protocol (ftp)<br />2.名词解释：<br /><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">DTP：<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">数据传输过程<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">EOR：记录尾<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">PI：协议解释器<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">NTV：<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">网络虚拟终端<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">NVFS：<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">网络虚拟文件系统</span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; "><br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">3.<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">控制连接是建立在USER-PIT和SERVER-PI之间用于交换命令与应答的通信链路。<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">4.<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">数据连接是传输数据的全双工连接。传输数据可以发生在服务器DTP和用户DTP之间也可以发生在两个服务器DTP之间。<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">5.<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">数据连接只传输数据，控制连接传送命令和响应。<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">6.<div style="display: inline-block; "></div></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">FTP使用Telnet协议进行控制连接<br /></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">7.<br /></span><br /><br /><br /><br />参考文章：<a href="http://blog.csdn.net/williamzhou/article/details/215293">http://blog.csdn.net/williamzhou/article/details/215293</a>&nbsp;<br /><img src ="http://www.blogjava.net/GavinMiao/aggbug/372732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-26 18:03 <a href="http://www.blogjava.net/GavinMiao/archive/2012/03/26/372732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的位运算应用</title><link>http://www.blogjava.net/GavinMiao/archive/2012/03/19/372204.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 19 Mar 2012 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/03/19/372204.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/372204.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/03/19/372204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/372204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/372204.html</trackback:ping><description><![CDATA[1， a &amp; 0xff 可得到a对应而二进制的最后8位；<br />2，左移n位--》表示乘以2的N次方<br />3, &nbsp;右移n位--&gt;表示除以2的N次方<img src ="http://www.blogjava.net/GavinMiao/aggbug/372204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-19 16:36 <a href="http://www.blogjava.net/GavinMiao/archive/2012/03/19/372204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java播放wav的基础代码（转载）</title><link>http://www.blogjava.net/GavinMiao/archive/2012/03/14/371860.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Wed, 14 Mar 2012 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/03/14/371860.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/371860.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/03/14/371860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/371860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/371860.html</trackback:ping><description><![CDATA[&nbsp;文章来源：<a href="http://hi.baidu.com/breezedancer/blog/item/7eebb499680d8f086e068cb9.html">http://hi.baidu.com/breezedancer/blog/item/7eebb499680d8f086e068cb9.html</a>&nbsp;<br /><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 20px; background-color: #e9e9e9; "><p style="line-height: normal; ">import&nbsp;javax.sound.sampled.*;<br style="line-height: normal; " />import&nbsp;java.io.*;<br style="line-height: normal; " />public&nbsp;class&nbsp;TestMusic{<br style="line-height: normal; " />&nbsp;<br style="line-height: normal; " />&nbsp;private&nbsp;AudioFormat&nbsp;format;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;byte[]&nbsp;samples;<br style="line-height: normal; " />&nbsp;<br style="line-height: normal; " />&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String&nbsp;args[])throws&nbsp;Exception{<br style="line-height: normal; " />&nbsp;&nbsp;TestMusic&nbsp;sound&nbsp;=new&nbsp;TestMusic("1.wav");<br style="line-height: normal; " />&nbsp;&nbsp;InputStream&nbsp;stream&nbsp;=new&nbsp;ByteArrayInputStream(sound.getSamples());<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;play&nbsp;the&nbsp;sound<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sound.play(stream);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;exit<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0);<br style="line-height: normal; " />&nbsp;}<br style="line-height: normal; " />&nbsp;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TestMusic(String&nbsp;filename)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;open&nbsp;the&nbsp;audio&nbsp;input&nbsp;stream<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000" style="line-height: normal; ">AudioInputStream&nbsp;stream&nbsp;=AudioSystem.getAudioInputStream(new&nbsp;File(filename));<br style="line-height: normal; " /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format&nbsp;=&nbsp;stream.getFormat();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;the&nbsp;audio&nbsp;samples<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;samples&nbsp;=&nbsp;getSamples(stream);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(UnsupportedAudioFileException&nbsp;ex)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;public&nbsp;byte[]&nbsp;getSamples()&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;samples;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;byte[]&nbsp;getSamples(AudioInputStream&nbsp;audioStream)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;get&nbsp;the&nbsp;number&nbsp;of&nbsp;bytes&nbsp;to&nbsp;read<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;length&nbsp;=&nbsp;(int)(audioStream.getFrameLength()&nbsp;*&nbsp;format.getFrameSize());</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;read&nbsp;the&nbsp;entire&nbsp;stream<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;samples&nbsp;=&nbsp;new&nbsp;byte[length];<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataInputStream&nbsp;is&nbsp;=&nbsp;new&nbsp;DataInputStream(audioStream);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.readFully(samples);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;return&nbsp;the&nbsp;samples<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;samples;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;<br style="line-height: normal; " />&nbsp;public&nbsp;void&nbsp;play(InputStream&nbsp;source)&nbsp;{</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;a&nbsp;short,&nbsp;100ms&nbsp;(1/10th&nbsp;sec)&nbsp;buffer&nbsp;for&nbsp;real-time<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;change&nbsp;to&nbsp;the&nbsp;sound&nbsp;stream<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;bufferSize&nbsp;=&nbsp;format.getFrameSize()&nbsp;*<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Math.round(format.getSampleRate()&nbsp;/&nbsp;10);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;buffer&nbsp;=&nbsp;new&nbsp;byte[bufferSize];</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;create&nbsp;a&nbsp;line&nbsp;to&nbsp;play&nbsp;to<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000" style="line-height: normal; ">&nbsp;SourceDataLine&nbsp;line;<br style="line-height: normal; " /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataLine.Info&nbsp;info&nbsp;=<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;DataLine.Info(SourceDataLine.class,&nbsp;format);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;=&nbsp;(SourceDataLine)AudioSystem.getLine(info);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line.open(format,&nbsp;bufferSize);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(LineUnavailableException&nbsp;ex)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;start&nbsp;the&nbsp;line<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line.start();</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;copy&nbsp;data&nbsp;to&nbsp;the&nbsp;line<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;numBytesRead&nbsp;=&nbsp;0;<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(numBytesRead&nbsp;!=&nbsp;-1)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numBytesRead&nbsp;=<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;source.read(buffer,&nbsp;0,&nbsp;buffer.length);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(numBytesRead&nbsp;!=&nbsp;-1)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line.write(buffer,&nbsp;0,&nbsp;numBytesRead);<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(IOException&nbsp;ex)&nbsp;{<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;wait&nbsp;until&nbsp;all&nbsp;data&nbsp;is&nbsp;played,&nbsp;then&nbsp;close&nbsp;the&nbsp;line<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line.drain();<br style="line-height: normal; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line.close();</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="line-height: normal; "><br style="line-height: normal; " />}</p></span><img src ="http://www.blogjava.net/GavinMiao/aggbug/371860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-14 14:30 <a href="http://www.blogjava.net/GavinMiao/archive/2012/03/14/371860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不同厂商JDK下载网址</title><link>http://www.blogjava.net/GavinMiao/archive/2012/03/08/371532.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 08 Mar 2012 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/03/08/371532.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/371532.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/03/08/371532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/371532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/371532.html</trackback:ping><description><![CDATA[<br /><br /><span class="Apple-style-span" style="font-family: Helvetica, Tahoma, Arial, sans-serif; line-height: 25px; background-color: #ffffff; ">各厂商JDK官网下载地址：&nbsp;<br />1、Oracle JDK，介质分32位和64位，分Linux、Solaris、Windows平台&nbsp;<br />http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html&nbsp;<br />2、HP JDK，介质不分32位和64位，分PA和IA平台&nbsp;<br />https://h20392.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=HPUXJDKJRE60&nbsp;<br />3、IBM JDK，介质分32位和64位&nbsp;<br />https://www.ibm.com/developerworks/java/jdk/aix/service.html#i1&nbsp;<br /><br /><br /></span>参考文章：<br /><div><a href="http://shuwen.iteye.com/blog/1149992">http://shuwen.iteye.com/blog/1149992</a></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/371532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-08 15:30 <a href="http://www.blogjava.net/GavinMiao/archive/2012/03/08/371532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>throws与throw的区别</title><link>http://www.blogjava.net/GavinMiao/archive/2012/03/06/371309.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Tue, 06 Mar 2012 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/03/06/371309.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/371309.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/03/06/371309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/371309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/371309.html</trackback:ping><description><![CDATA[1.throw是语句抛出一个异常，throws是方法抛出异常；<br />2.throws可声明多个异常，用逗号分割；<br />3.throws可单独使用，throw必须与try-catch-finally或throws搭配使用；<br />4.throws表示可能抛出哪些异常，throw是必定抛出这个异常；<img src ="http://www.blogjava.net/GavinMiao/aggbug/371309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-03-06 09:48 <a href="http://www.blogjava.net/GavinMiao/archive/2012/03/06/371309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CLASS_PATH认识</title><link>http://www.blogjava.net/GavinMiao/archive/2012/02/22/370517.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Wed, 22 Feb 2012 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/02/22/370517.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/370517.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/02/22/370517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/370517.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/370517.html</trackback:ping><description><![CDATA[作用：JRE按CLASS_PATH指定的路径搜索类文件；<br />注意：<br />1.一般设置：<br />CLASS_PATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;<br />2.jdk 1.5以上版本可以不用设置此环境变量；<img src ="http://www.blogjava.net/GavinMiao/aggbug/370517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-02-22 13:51 <a href="http://www.blogjava.net/GavinMiao/archive/2012/02/22/370517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转载）System.getProperty()</title><link>http://www.blogjava.net/GavinMiao/archive/2012/02/13/369883.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 13 Feb 2012 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/02/13/369883.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/369883.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/02/13/369883.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/369883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/369883.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文章来源：http://www.blogjava.net/javafield/archive/2008/01/05/172952.htmlSystem.getProperty()&nbsp;1public&nbsp;class&nbsp;Information&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;st...&nbsp;&nbsp;<a href='http://www.blogjava.net/GavinMiao/archive/2012/02/13/369883.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/369883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-02-13 16:52 <a href="http://www.blogjava.net/GavinMiao/archive/2012/02/13/369883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java相关下载网址</title><link>http://www.blogjava.net/GavinMiao/archive/2012/01/18/368691.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Wed, 18 Jan 2012 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2012/01/18/368691.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/368691.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2012/01/18/368691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/368691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/368691.html</trackback:ping><description><![CDATA[hibernate：<br /><div><a href="http://sourceforge.net/projects/hibernate/files/">http://sourceforge.net/projects/hibernate/files/<br />struts</a>1：<br /><div><a href="http://archive.apache.org/dist/struts/">http://archive.apache.org/dist/struts/</a>&nbsp;&nbsp;<br />struts2：<br /><div><a href="http://archive.apache.org/dist/struts/binaries/">http://archive.apache.org/dist/struts/binaries/</a>&nbsp;<br />ibatis2:<br /><div><a href="http://archive.apache.org/dist/ibatis/binaries/ibatis.java/">http://archive.apache.org/dist/ibatis/binaries/ibatis.java/</a>&nbsp;<br />ibatis3：<br /><div><a href="http://archive.apache.org/dist/ibatis/binaries/ibatis.java/ibatis-3/">http://archive.apache.org/dist/ibatis/binaries/ibatis.java/ibatis-3/</a>&nbsp;<br />ibator1.2：<br /><div style="display: inline-block; "><div><a href="http://code.google.com/p/mybatis/downloads/list?can=1">http://code.google.com/p/mybatis/downloads/list?can=1</a>&nbsp;<br />sitemesh2：<br /><div><a href="http://java.net/downloads/sitemesh/">http://java.net/downloads/sitemesh/</a>&nbsp;<br />spring2:<br /><div><a href="http://sourceforge.net/projects/springframework/files/springframework-2/">http://sourceforge.net/projects/springframework/files/springframework-2/</a>&nbsp;&nbsp;<br />spring 下载中心：<br /><div><a href="http://www.springsource.org/download">http://www.springsource.org/download</a>&nbsp;<br />jstl下载：<br /><div><a href="http://tomcat.apache.org/taglibs/standard/">http://tomcat.apache.org/taglibs/standard/</a></div><br /><br /><br /></div></div></div></div></div></div></div></div></div></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/368691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2012-01-18 11:35 <a href="http://www.blogjava.net/GavinMiao/archive/2012/01/18/368691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>页面utf-8，jsp提交中文action中乱码</title><link>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364826.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 25 Nov 2011 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364826.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/364826.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/364826.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/364826.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2011/11/25/364826.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/364826.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-11-25 15:11 <a href="http://www.blogjava.net/GavinMiao/archive/2011/11/25/364826.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：java断言Assertion</title><link>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364813.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 25 Nov 2011 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364813.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/364813.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/11/25/364813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/364813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/364813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文章来源：http://www.cnblogs.com/woodslee/articles/165669.html&nbsp;一、&nbsp;Assertion的语法和语义J2SE 1.4在语言上提供了一个新特性，就是assertion(断言)功能，它是该版本在Java语言方面最大的革新。在软件开发中，assertion是一种经典的调试、测试方式，本文将深入解析assertion功能的使用以及其设...&nbsp;&nbsp;<a href='http://www.blogjava.net/GavinMiao/archive/2011/11/25/364813.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/364813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-11-25 13:20 <a href="http://www.blogjava.net/GavinMiao/archive/2011/11/25/364813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操控pdf</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359824.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359824.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359824.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359824.html</trackback:ping><description><![CDATA[hehe,待续........<img src ="http://www.blogjava.net/GavinMiao/aggbug/359824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:29 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操控xls</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359825.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359825.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359825.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359825.html</trackback:ping><description><![CDATA[sorry,今天列个提纲，待续....<img src ="http://www.blogjava.net/GavinMiao/aggbug/359825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:29 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作json</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359821.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359821.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359821.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359821.html</trackback:ping><description><![CDATA[json认识：<br />待续.......<img src ="http://www.blogjava.net/GavinMiao/aggbug/359821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:27 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作properties</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359822.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:27:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359822.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359822.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359822.html</trackback:ping><description><![CDATA[properties解析.....<img src ="http://www.blogjava.net/GavinMiao/aggbug/359822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:27 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作xml</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359820.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:25:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359820.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359820.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359820.html</trackback:ping><description><![CDATA[待续........<img src ="http://www.blogjava.net/GavinMiao/aggbug/359820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:25 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：JAVA异常机制介绍/如何正确的进行JAVA异常处理</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359819.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 29 Sep 2011 17:08:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359819.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359819.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/30/359819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359819.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #333333; font-family: verdana, ����, Arial; background-color: #ffffff; "><p align="left" style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;文章来源：<br /></strong><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.5; color: #000000; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;作者：Maverick<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></strong></span><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.5; color: #000000; ">&nbsp;blog：</span></strong><a href="http://blog.csdn.net/zhaohuabing" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #336699; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #999999; border-top-color: #999999; border-right-color: #999999; border-left-color: #999999; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.5; color: #0000ff; ">http://blog.csdn.net/</span>zhaohuabing</a><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.5; color: #000000; ">&nbsp;&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></span><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />1&nbsp;&nbsp;引言<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />在JAVA语言出现以前，传统的异常处理方式多采用返回值来标识程序出现的异常情况，这种方式虽然为程序员所熟悉，但却有多个坏处。首先，一个API可以返回任意的返回值，而这些返回值本身并不能解释该返回值是否代表一个异常情况发生了和该异常的具体情况，需要调用API的程序自己判断并解释返回值的含义。其次，并没有一种机制来保证异常情况一定会得到处理，调用程序可以简单的忽略该返回值，需要调用API的程序员记住去检测返回值并处理异常情况。这种方式还让程序代码变得晦涩冗长，当进行IO操作等容易出现异常情况的处理时，你会发现代码的很大部分用于处理异常情况的switch分支，程序代码的可读性变得很差。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />上面提到的问题，JAVA的异常处理机制提供了很好的解决方案。通过抛出JDK预定义或者自定义的异常,能够表明程序中出现了什么样的异常情况；而且JAVA的语言机制保证了异常一定会得到恰当的处理；合理的使用异常处理机制，会让程序代码清晰易懂。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />2&nbsp;JAVA异常的处理机制<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; 当程序中抛出一个异常后，程序从程序中导致异常的代码处跳出，java虚拟机检测寻找和try关键字匹配的处理该异常的catch块，如果找到，将控制权交到catch块中的代码，然后继续往下执行程序，try块中发生异常的代码不会被重新执行。如果没有找到处理该异常的catch块，在所有的finally块代码被执行和当前线程的所属的ThreadGroup的uncaughtException方法被调用后，遇到异常的当前线程被中止。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />3&nbsp;JAVA异常的类层次<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />JAVA异常的类层次如下图所示：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><img src="http://blog.csdn.net/images/blog_csdn_net/zhaohuabing/201680/o_JAVA%E5%BC%82%E5%B8%B8%E6%9C%BA%E5%88%B6%E4%BB%8B%E7%BB%8D%E5%A6%82%E4%BD%95%E6%AD%A3%E7%A1%AE%E7%9A%84%E8%BF%9B%E8%A1%8CJAVA%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86_%E5%9B%BE1.gif" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-style: initial; border-color: initial; "  alt="" /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /><span lang="EN-US" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 21px; font-size: 10.5pt; font-family: 'Times New Roman'; "><v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></v:shapetype></span>图1 JAVA异常的类层次<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />Throwable是所有异常的基类，程序中一般不会直接抛出Throwable对象，Exception和Error是Throwable的子类，Exception下面又有RuntimeException和一般的Exception两类。可以把JAVA异常分为三类：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一类是Error，Error表示程序在运行期间出现了十分严重、不可恢复的错误，在这种情况下应用程序只能中止运行，例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常；一般情况下，在程序中也不应该抛出Error类型的异常。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二类是RuntimeException, RuntimeException 是一种unchecked Exception，即表示编译器不会检查程序是否对RuntimeException作了处理，在程序中不必捕获RuntimException类型的异常，也不必在方法体声明抛出RuntimeException类。RuntimeException发生的时候，表示程序中出现了编程错误，所以应该找出错误修改程序，而不是去捕获RuntimeException。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三类是一般的checked Exception,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception，如图1中的IOException和ClassNotFoundException。JAVA 语言规定必须对checked Exception作处理，编译器会对此作检查，要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理，不然不能通过编译。checked Exception用于以下的语义环境：</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（1）&nbsp;该异常发生后是可以被恢复的，如一个Internet连接发生异常被中止后，可以重新连接再进行后续操作。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（2）&nbsp;程序依赖于不可靠的外部条件，该依赖条件可能出错，如系统IO。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（3）&nbsp;该异常发生后并不会导致程序处理错误，进行一些处理后可以继续后续操作。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">4&nbsp;JAVA异常处理中的注意事项<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />合理使用JAVA异常机制可以使程序健壮而清晰，但不幸的是，JAVA异常处理机制常常被错误的使用，下面就是一些关于Exception的注意事项：</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">1．&nbsp;不要忽略checked Exception<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />请看下面的代码：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; method1();&nbsp; //method1抛出ExceptionA<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(ExceptionA e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; e.printStackTrace();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />上面的代码似乎没有什么问题，捕获异常后将异常打印，然后继续执行。事实上在catch块中对发生的异常情况并没有作任何处理(打印异常不能是算是处理异常，因为在程序交付运行后调试信息就没有什么用处了)。这样程序虽然能够继续执行，但是由于这里的操作已经发生异常，将会导致以后的操作并不能按照预期的情况发展下去，可能导致两个结果：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />一是由于这里的异常导致在程序中别的地方抛出一个异常，这种情况会使程序员在调试时感到迷惑，因为新的异常抛出的地方并不是程序真正发生问题的地方，也不是发生问题的真正原因；<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />另外一个是程序继续运行，并得出一个错误的输出结果，这种问题更加难以捕捉，因为很可能把它当成一个正确的输出。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />那么应该如何处理呢，这里有四个选择：</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">（1）&nbsp;处理异常，进行修复以让程序继续执行。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（2）&nbsp;重新抛出异常，在对异常进行分析后发现这里不能处理它，那么重新抛出异常，让调用者处理。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（3）&nbsp;将异常转换为用户可以理解的自定义异常再抛出，这时应该注意不要丢失原始异常信息（见5）。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（4）&nbsp;不要捕获异常。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">因此，当捕获一个unchecked Exception的时候，必须对异常进行处理；如果认为不必要在这里作处理，就不要捕获该异常，在方法体中声明方法抛出异常，由上层调用者来处理该异常。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">2．&nbsp;不要一次捕获所有的异常<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />请看下面的代码：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; method1();&nbsp; //method1抛出ExceptionA<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method2();&nbsp; //method1抛出ExceptionB<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method3();&nbsp; //method1抛出ExceptionC<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(Exception e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />这是一个很诱人的方案，代码中使用一个catch子句捕获了所有异常，看上去完美而且简洁，事实上很多代码也是这样写的。但这里有两个潜在的缺陷，一是针对try块中抛出的每种Exception，很可能需要不同的处理和恢复措施，而由于这里只有一个catch块，分别处理就不能实现。二是try块中还可能抛出RuntimeException,代码中捕获了所有可能抛出的RuntimeException而没有作任何处理，掩盖了编程的错误，会导致程序难以调试。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />下面是改正后的正确代码：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp; method1();&nbsp; //method1抛出ExceptionA<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method2();&nbsp; //method1抛出ExceptionB<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method3();&nbsp; //method1抛出ExceptionC<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(ExceptionA e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(ExceptionB e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(ExceptionC e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />3．&nbsp;使用finally块释放资源<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; finally关键字保证无论程序使用任何方式离开try块，finally中的语句都会被执行。在以下三种情况下会进入finally块：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（1）&nbsp;try块中的代码正常执行完毕。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（2）&nbsp;在try块中抛出异常。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（3）&nbsp;在try块中执行return、break、continue。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />因此，当你需要一个地方来执行在任何情况下都必须执行的代码时，就可以将这些<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />代码放入finally块中。当你的程序中使用了外界资源,如数据库连接，文件等，必须将释放这些资源的代码写入finally块中。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />必须注意的是，在finally块中不能抛出异常。JAVA异常处理机制保证无论在任何情况下必须先执行finally块然后在离开try块，因此在try块中发生异常的时候，JAVA虚拟机先转到finally块执行finally块中的代码，finally块执行完毕后，再向外抛出异常。如果在finally块中抛出异常，try块捕捉的异常就不能抛出，外部捕捉到的异常就是finally块中的异常信息，而try块中发生的真正的异常堆栈信息则丢失了。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />请看下面的代码：</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">Connection&nbsp; con = null;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; con = dataSource.getConnection();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(SQLException e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; throw e;//进行一些处理后再将数据库异常抛出给调用者处理<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />finally<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; con.close();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; catch(SQLException e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; e.printStackTrace();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />运行程序后，调用者得到的信息如下<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />java.lang.NullPointerException<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;at myPackage.MyClass.method1(methodl.java:266)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />而不是我们期望得到的数据库异常。这是因为这里的con是null的关系，在finally语句中抛出了NullPointerException,在finally块中增加对con是否为null的判断可以避免产生这种情况。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">4．&nbsp;异常不能影响对象的状态<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />异常产生后不能影响对象的状态，这是异常处理中的一条重要规则。 在一个函数<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />中发生异常后，对象的状态应该和调用这个函数之前保持一致，以确保对象处于正确的状态中。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />如果对象是不可变对象(不可变对象指调用构造函数创建后就不能改变的对象，即<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; 创建后没有任何方法可以改变对象的状态)，那么异常发生后对象状态肯定不会改变。如果是可变对象，必须在编程中注意保证异常不会影响对象状态。有三个方法可以达到这个目的：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（1）&nbsp;将可能产生异常的代码和改变对象状态的代码分开，先执行可能产生异常的代码，如果产生异常，就不执行改变对象状态的代码。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（2）&nbsp;对不容易分离产生异常代码和改变对象状态代码的方法，定义一个recover方法，在异常产生后调用recover方法修复被改变的类变量，恢复方法调用前的类状态。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />（3）&nbsp;在方法中使用对象的拷贝，这样当异常发生后，被影响的只是拷贝，对象本身不会受到影响。</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">5．&nbsp;丢失的异常<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />请看下面的代码：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />public void method2()<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method1();&nbsp; //method1进行了数据库操作<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(SQLException e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; throw new MyException(&#8220;发生了数据库异常:&#8221;+e.getMessage);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />public void method3()<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; method2();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(MyException e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; e.printStackTrace();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />上面method2的代码中，try块捕获method1抛出的数据库异常SQLException后，抛出了新的自定义异常MyException。这段代码是否并没有什么问题，但看一下控制台的输出：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />MyException:发生了数据库异常：对象名称 'MyTable' 无效。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />at MyClass.method2(MyClass.java:232)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />at MyClass.method3(MyClass.java:255)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />原始异常SQLException的信息丢失了，这里只能看到method2里面定义的MyException的堆栈情况；而method1中发生的数据库异常的堆栈则看不到，如何排错呢，只有在method1的代码行中一行行去寻找数据库操作语句了，祈祷method1的方法体短一些吧。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />JDK的开发者们也意识到了这个情况，在JDK1.4.1中，Throwable类增加了两个构造方法,public Throwable(Throwable cause)和public Throwable(String message,Throwable cause)，在构造函数中传入的原始异常堆栈信息将会在printStackTrace方法中打印出来。但对于还在使用JDK1.3的程序员，就只能自己实现打印原始异常堆栈信息的功能了。实现过程也很简单，只需要在自定义的异常类中增加一个原始异常字段，在构造函数中传入原始异常，然后重载printStackTrace方法，首先调用类中保存的原始异常的printStackTrace方法，然后再调用super.printStackTrace方法就可以打印出原始异常信息了。可以这样定义前面代码中出现的MyException类：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />public class MyExceptionextends Exception<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; //构造函数<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; public SMException(Throwable cause)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.cause_ = cause;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;&nbsp;&nbsp; public MyException(String s,Throwable cause)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.cause_ = cause;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; //重载printStackTrace方法，打印出原始异常堆栈信息<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; public void printStackTrace()<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cause_ != null)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cause_.printStackTrace();<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.printStackTrace(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;&nbsp;&nbsp; public void printStackTrace(PrintStream s)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cause_ != null)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cause_.printStackTrace(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.printStackTrace(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">&nbsp;&nbsp;&nbsp; public void printStackTrace(PrintWriter s)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cause_ != null)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cause_.printStackTrace(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.printStackTrace(s);<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; }<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; //原始异常<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp; private Throwable cause_;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">6．&nbsp;不要使用同时使用异常机制和返回值来进行异常处理<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />下面是我们项目中的一段代码<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; doSomething();&nbsp;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(MyException e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />if(e.getErrcode == -1)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />if(e.getErrcode == -2)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />假如在过一段时间后来看这段代码，你能弄明白是什么意思吗？混合使用JAVA异常处理机制和返回值使程序的异常处理部分变得&#8220;丑陋不堪&#8221;，并难以理解。如果有多种不同的异常情况，就定义多种不同的异常，而不要像上面代码那样综合使用Exception和返回值。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />修改后的正确代码如下：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />try<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; doSomething();&nbsp; //抛出MyExceptionA和MyExceptionB<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(MyExceptionA e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />catch(MyExceptionB e)<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />{<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />}</p><p style="margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />7．&nbsp;不要让try块过于庞大<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />出于省事的目的，很多人习惯于用一个庞大的try块包含所有可能产生异常的代码，<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />这样有两个坏处：<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />阅读代码的时候，在try块冗长的代码中，不容易知道到底是哪些代码会抛出哪些异常，不利于代码维护。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " />使用try捕获异常是以程序执行效率为代价的，将不需要捕获异常的代码包含在try块中，影响了代码执行的效率。</p></span><img src ="http://www.blogjava.net/GavinMiao/aggbug/359819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-30 01:08 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/30/359819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE学习网址积累</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/27/359626.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Tue, 27 Sep 2011 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/27/359626.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359626.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/27/359626.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359626.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359626.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2011/09/27/359626.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/359626.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-27 16:29 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/27/359626.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获得一个随机数</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/23/359329.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 23 Sep 2011 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/23/359329.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/359329.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/23/359329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/359329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/359329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2011/09/23/359329.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/359329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-23 10:43 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/23/359329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈memory leak</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/07/358176.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Wed, 07 Sep 2011 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/07/358176.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/358176.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/07/358176.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/358176.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/358176.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif, SimSun; line-height: 22px; background-color: #ffffff; "><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; white-space: pre-wrap; ">参考文章：<br /><div style="display: inline-block; "><div><a href="http://www.ibm.com/developerworks/java/library/j-leaks/">http://www.ibm.com/developerworks/java/library/j-leaks/</a></div></div><br /><div><a href="http://blog.csdn.net/michaellufhl/article/details/4785832">http://blog.csdn.net/michaellufhl/article/details/4785832</a></div>malloc/free和new/delete必须成对出现，以防止内存泄露<br /></pre></span><span class="Apple-style-span" style="font-family: Tahoma, Verdana, Simsun; background-color: #f7f7f7; "><br />一、什么时候垃圾回收：<br />简单说：<br /></span><span class="Apple-style-span" style="font-family: Tahoma, Verdana, Simsun; background-color: #f7f7f7; ">当一块内存被jvm通过它自己的认证机制认为不再被调用的时候才会在<br />它认为合适的时机进行回收；<br /></span><span class="Apple-style-span" style="font-family: Tahoma, Verdana, Simsun; background-color: #f7f7f7; ">具体说：<br /></span><span class="Apple-style-span" style="font-family: Simsun; line-height: normal; background-color: #ffffff; font-size: medium; "><p style="font-family: arial, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; ">The job of the garbage collector is to find objects that are no longer needed by an application and to remove them when they can no longer be accessed or referenced. The garbage collector starts at the root nodes, classes that persist throughout the life of a Java application, and sweeps through all of the nodes that are referenced. As it traverses the nodes, it keeps track of which objects are actively being referenced. Any classes that are no longer being referenced are then eligible to be garbage collected. The memory resources used by these objects can be returned to the Java virtual machine (JVM) when the objects are deleted.</p><p style="font-family: arial, sans-serif; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0.3em; padding-right: 5px; padding-bottom: 0.7em; padding-left: 5px; font-size: 0.76em; ">So it is true that Java code does not require the programmer to be responsible for memory management cleanup, and that it automatically garbage collects unused objects. However, the key point to remember is that&nbsp;<em>an object is only counted as being unused when it is no longer referenced</em>.<br /><br /></p></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><font>垃圾收集器的工作是找到由一个应用程序不再需要的对象，在</font></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; ">他们不再被访问或引用</span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><font>将其删除。</font><font class="">垃圾收集器从根节点、在整个Java应用的生命中存在的类<div style="display: inline-block; "></div></font></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; ">开始</span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><font class="">，并通过扫描所有被引用的节点。</font><font>由于它遍历的节点，它跟踪哪些对象正在积极引用。</font><font class="">任何不再被引用的的类，然后才有资格被垃圾收集。<div style="display: inline-block; "></div></font></span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; ">当对象被删除时，</span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><font>他们所占用的内存资源，才被Java虚拟机（JVM）回收。<br /></font></span><span class="Apple-style-span" style="font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff; ">二、<a href="http://blog.csdn.net/michaellufhl/article/details/4785832" title="什么样的java代码容易memory leak?" style="color: #000000; text-decoration: none; ">什么样的java代码容易memory leak?<br />1.<div style="display: inline-block; "></div></a></span><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">首先一种情况是collection或者是map一直被put数据，没有机会remove，导致OutOfMemoryError。尤其是当collection或者是map被设计成static变量的时候，它就是个global性质的变量，很可能永远不会被赋为null。这也是不建议使用static变量的一个原因。</span><span class="Apple-style-span" style="font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff; "><a href="http://blog.csdn.net/michaellufhl/article/details/4785832" title="什么样的java代码容易memory leak?" style="color: #000000; text-decoration: none; "><br /></a></span>2.<div style="display: inline-block; "></div><span class="Apple-style-span" style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; ">在listener的模式下，如果listener一直在注册register而没有机会remove也会导致OutOfMemoryError。其实listener也是一个list的结构，本质上是一样的。很多listener是以匿名类被构造和注册到被监听类上面去的， 而被监听类如果也没有正确remove注册的listener的话也会导致OutOfMemoryError。<br /><br /><br />待续...........</span><img src ="http://www.blogjava.net/GavinMiao/aggbug/358176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-07 14:04 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/07/358176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP、servlet、struts线程安全问题分析</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/02/357796.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Fri, 02 Sep 2011 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/02/357796.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357796.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/02/357796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357796.html</trackback:ping><description><![CDATA[<div><div style="font-family: Simsun; line-height: 24px; "><div>参考文章：<br /><a href="http://www.51cto.com/specbook/24/32858.htm">http://www.51cto.com/specbook/24/32858.htm<br /></a><div><a href="http://www.blogjava.net/nikita/archive/2009/09/11/294784.html">http://www.blogjava.net/nikita/archive/2009/09/11/294784.html</a></div><a href="http://www.51cto.com/specbook/24/32858.htm"></a></div>Servlet之所以比CGI效率高就是因为Servlet是多线程的。</div><font class="Apple-style-span" face="Simsun"><span class="Apple-style-span" style="line-height: 24px;">Servlet规范已经声明Servlet不是线程安全的.</span></font><br /><div><font class="Apple-style-span" face="Simsun"><span class="Apple-style-span" style="line-height: 24px;">JSP中使用声明的变量是Servlet的实例变量,不是线程安全的,其他都是线程安全的。</span></font><br /><div style="font-family: Simsun; line-height: 24px; "><p>那么怎样才能是Servlet安全呢,凡是多个线程可以共享的就不要使用(实例变量+类变量),就这么简单。也可以使用synchronized同步方法,但是这样效率不高,还可以使用单线程模型,这样的话效率就更低了,100个请求同时来的时候就要实例化100个实例。</p><p>方法中的临时变量是不会影响线程安全的,因为他们是在栈上分配空间,而且每个线程都有自己私有的栈空间。</p></div><div><font class="Apple-style-span" face="Simsun"><span class="Apple-style-span" style="line-height: 24px; ">总结：线程安全问题主要是由实例变量造成的,不管在Servlet还是JSP,或者在Struts的Action里面,不要使用实例变量,<br />任何方法里面都不要出现实例变量,你的程序就是线程安全的。</span></font><br /><br /><div><div style="line-height: 24px; "></div><div style="line-height: 24px;"><div></div><div>在Servlet/JSP中的几种变量类型</div><div></div><div>源自 :　http://www.javaresearch.org/article/8465.htm</div><div></div><div>一、在Servlet/JSP中的几种变量类型</div><div></div><div></div><div>在编写Servlet/JSP程序时，对实例变量一定要小心使用。因为实例变量是非线程安全的。</div><div>在Servlet/JSP中，变量可以归为下面的几类：</div><div></div><div>1. 类变量</div><div>request，response，session，config，application，以及JSP页面内置的page, pageContext。</div><div>其中除了application外，其它都是线程安全的。</div><div></div><div>2. 实例变量</div><div>实例变量是实例所有的，在堆中分配。在Servlet/JSP容器中，一般仅实例化一个Servlet/JSP实例，</div><div>启动多个该实例的线程来处理请求。而实例变量是该实例所有的线程所共享，所以，实例变量不是线程安全的。</div><div></div><div>3. 局部变量</div><div>局部变量在堆栈中分配，因为每一个线程有自己的执行堆栈，所以，局部变量是线程安全的。</div><div></div><div>二、在Servlet/JSP中的多线程同步问题</div><div></div><div></div><div>在JSP中，使用实例变量要特别谨慎。首先请看下面的代码：</div><div>// instanceconcurrenttest.jsp</div><div>&lt;%@ page contentType="text/html;charset=GBK" %&gt;</div><div>&lt;%!</div><div>&nbsp; &nbsp; //定义实例变量</div><div>&nbsp; &nbsp; String username;</div><div>&nbsp; &nbsp; String password;</div><div>&nbsp; &nbsp; java.io.PrintWriter output;</div><div>%&gt;</div><div>&lt;%</div><div>&nbsp; &nbsp; //从request中获取参数</div><div>&nbsp; &nbsp; username = request.getParameter("username");</div><div>&nbsp; &nbsp; password = request.getParameter("password");</div><div>&nbsp; &nbsp; output = response.getWriter();</div><div>&nbsp; &nbsp; showUserInfo(); &nbsp; &nbsp;</div><div>%&gt;</div><div>&lt;%!</div><div>&nbsp; &nbsp; public void showUserInfo() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //为了突出并发问题，在这儿首先执行一个费时操作</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int i =0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double sum = 0.0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (i++ &lt; 200000000) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; output.println(Thread.currentThread().getName() + "&lt;br&gt;");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; output.println("username:" + username + "&lt;br&gt;");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; output.println("password:" + password + "&lt;br&gt;");</div><div>&nbsp; &nbsp; }</div><div>%&gt;</div><div>在这个页面中，首先定义了两个实例变量，username和password。</div><div>然后在从request中获取这两个参数，并调用showUserInfo()方法将请求用户的信息回显在该客户的浏览器上。</div><div>在一个用户访问是，不存在问题。</div><div>但在多个用户并发访问时，就会出现其它用户的信息显示在另外一些用户的浏览器上的问题。这是一个严重的问题。</div><div>为了突出并发问题，便于测试、观察，我们在回显用户信息时执行了一个模拟的费时操作，</div><div>比如，下面的两个用户同时访问（可以启动两个IE浏览器，或者在两台机器上同时访问）：</div><div>a： &nbsp; &nbsp;http://localhost:8080/instanceconcurrenttest.jsp?username=a&amp;password=123</div><div>b： &nbsp; &nbsp;http://localhost:8080/instanceconcurrenttest.jsp?username=b&amp;password=456</div><div></div><div>如果a点击链接后，b再点击链接，那么，a将返回一个空白屏幕，b则得到a以及b两个线程的输出。请看下面的屏幕截图：</div><div>&nbsp;</div><div></div><div></div><div>从运行结果的截图上可以看到，Web服务器启动了两个线程分别来处理来自a和b的请求，但是在a却得到一个空白的屏幕。这是因为上面程序中的output, username和password都是实例变量，是所有线程共享的。在a访问该页面后，将output设置为a的输出，username,password分别置为a的信息，而在a执行printUserInfo()输出username和password信息前，b又访问了该页面，把username和password置为了b的信息，并把输出output指向到了b。随后a的线程打印时，就打印到了b的屏幕了，并且，a的用户名和密码也被b的取代。请参加下图所示：</div><div></div><div></div><div></div><div>而实际程序中，由于设置实例变量，使用实例变量这两个时间点非常接近，</div><div>所以，像本例的同步问题并没有这么突出，可能会偶尔出现，但这却更加具有危险性，也更加难于调试。</div><div></div><div>同样，对于Servlet也存在实例变量的多线程问题，请看上面页面的Servlet版：</div><div>// InstanceConcurrentTest.java</div><div>import javax.servlet.*;</div><div>import javax.servlet.http.*;</div><div>import java.io.PrintWriter;</div><div>public class InstanceConcurrentTest extends HttpServlet&nbsp;</div><div>{</div><div>&nbsp; &nbsp; String username;</div><div>&nbsp; &nbsp; String password;</div><div>&nbsp; &nbsp; PrintWriter out;</div><div>&nbsp; &nbsp; public void doGet(HttpServletRequest request, HttpServletResponse response)&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throws ServletException,java.io.IOException</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //从request中获取参数</div><div>&nbsp; &nbsp; &nbsp; &nbsp; username = request.getParameter("username");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; password = request.getParameter("password");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(Thread.currentThread().getName() +&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;" | set username:" + username);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; out = response.getWriter();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; showUserInfo(); &nbsp; &nbsp;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; public void showUserInfo() {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //为了突出并发问题，在这儿首先执行一个费时操作</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int i =0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double sum = 0.0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (i++ &lt; 200000000) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp; out.println("thread:" + Thread.currentThread().getName());</div><div>&nbsp; &nbsp; &nbsp; &nbsp; out.println("username:"+ username);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; out.println("password:" + password);</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>三、解决方案</div><div></div><div></div><div>1. 以单线程运行Servlet/JSP</div><div></div><div></div><div>在JSP中，通过设置：&lt;%@ page isThreadSafe="false" %&gt;，在Servlet中，</div><div>通过实现javax.servlet.SingleThreadModel，</div><div>此时Web容器将保证JSP或Servlet实例以单线程方式运行。</div><div></div><div>重要提示：在测试中发现，Tomcat 4.1.17不能正确支持isThreadSafe属性，</div><div>所以，指定isTheadSafe为false后，在Tomcat 4.1.17中仍然出现多线程问题，这是Tomcat 4.1.17的Bug。在Tomcat 3.3.1和Resin 2.1.5中测试通过。</div><div></div><div>2. 去除实例变量，通过参数传递</div><div></div><div></div><div>从上面的分析可见，应该在Servlet/JSP中尽量避免使用实例变量。</div><div>比如，下面的修正代码，去除了实例变量，通过定义局部变量，并参数进行传递。</div><div>这样，由于局部变量是在线程的堆栈中进行分配的，所以是线程安全的。</div><div>不会出现多线程同步的问题。代码如下：</div><div>&lt;%@ page contentType="text/html;charset=GBK" %&gt;</div><div>&lt;%</div><div>&nbsp; &nbsp; //使用局部变量</div><div>&nbsp; &nbsp; String username;</div><div>&nbsp; &nbsp; String password;</div><div>&nbsp; &nbsp; java.io.PrintWriter output;</div><div>&nbsp; &nbsp; //从request中获取参数</div><div>&nbsp; &nbsp; username = request.getParameter("username");</div><div>&nbsp; &nbsp; password = request.getParameter("password");</div><div>&nbsp; &nbsp; output = response.getWriter();</div><div>&nbsp; &nbsp; showUserInfo(output, username, password); &nbsp; &nbsp;</div><div>%&gt;</div><div>&lt;%!</div><div>&nbsp; &nbsp; public void showUserInfo(java.io.PrintWriter _output,&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String _username, String _password) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; //为了突出并发问题，在这儿首先执行一个费时操作</div><div>&nbsp; &nbsp; &nbsp; &nbsp; int i =0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; double sum = 0.0;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; while (i++ &lt; 200000000) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum += i;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; _output.println(Thread.currentThread().getName() + "&lt;br&gt;");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; _output.println("username:" + _username + "&lt;br&gt;");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; _output.println("password:" + _password + "&lt;br&gt;");</div><div>&nbsp; &nbsp; }</div><div>%&gt;</div><div></div><div>注：有的资料上指出在printUserInfo()方法或者实例变量的相关操作语句上使用synchronized关键字进行同步，</div><div>但这样并不能解决多线程的问题。因为，这样虽然可以使对实例变量的操作代码进行同步，</div><div>但并不能阻止一个线程使用另外一个线程修改后的&#8220;脏的&#8221;实例变量。</div><div>所以，除了降低运行效率外，不会起到预期效果。</div></div><div style="line-height: 24px; "><br /><br />待续...............</div></div></div></div></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/357796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-02 10:30 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/02/357796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM类加载初始化学习笔记(转载)</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357739.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 01 Sep 2011 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357739.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357739.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357739.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文章来源：http://developer.51cto.com/art/200906/129346.htm1. Classloader的作用，概括来说就是将编译后的class装载、加载到机器内存中，为了以后的程序的执行提供前提条件。2. 一段程序引发的思考：风中叶老师在他的视频中给了我们一段程序，号称是世界上所有的Java程序员都会犯的错误。诡异代码如下：Java代码package&nbsp;te...&nbsp;&nbsp;<a href='http://www.blogjava.net/GavinMiao/archive/2011/09/01/357739.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/357739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-01 15:09 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/01/357739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java内存溢出的详细解决方案（转载）</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357737.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 01 Sep 2011 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357737.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357737.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357737.html</trackback:ping><description><![CDATA[<div>文章来源：<a href="http://developer.51cto.com/art/200906/129346.htm">http://developer.51cto.com/art/200906/129346.htm<br /><div style="display: inline-block; "><div><div></div><div>一、内存溢出类型</div><div></div><div>1、java.lang.OutOfMemoryError: PermGen space</div><div></div><div>JVM管理两种类型的内存，堆和非堆。堆是给开发人员用的上面说的就是，是在JVM启动时创建；非堆是留给JVM自己用的，用来存放类的信息的。它和堆不同，运行期内GC不会释放空间。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小，超出了也会导致这块内存的占用过多造成溢出，或者tomcat热部署时侯不会清理前面加载的环境，只会将context更改为新部署的，非堆存的内容就会越来越多。</div><div></div><div>PermGen space的全称是Permanent Generation space,是指内存的永久保存区域，这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中，它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理，所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误，这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。&nbsp;</div><div>一个最佳的配置例子：(经过本人验证，自从用此配置之后，再未出现过tomcat死掉的情况)</div><div></div><div>set JAVA_OPTS=-Xms800m -Xmx800m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m</div><div></div><div>2、java.lang.OutOfMemoryError: Java heap space</div><div></div><div>第一种情况是个补充，主要存在问题就是出现在这个情况中。其默认空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40％，JVM就会增大堆到Xmx设置的值，内存剩余超过70％，JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。假设物理内存无限大，那么JVM内存的最大值跟操作系统有关，一般32位机是1.5g到3g之间，而64位的就不会有限制了。</div><div></div><div>注意：如果Xms超过了Xmx值，或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。</div><div></div><div>垃圾回收GC的角色</div><div></div><div>JVM调用GC的频度还是很高的，主要两种情况下进行垃圾回收：</div><div></div><div>当应用程序线程空闲；另一个是java内存堆不足时，会不断调用GC，若连续回收都解决不了内存堆不足的问题时，就会报out of memory错误。因为这个异常根据系统运行环境决定，所以无法预期它何时出现。</div><div></div><div>根据GC的机制，程序的运行会引起系统运行环境的变化，增加GC的触发机会。</div><div></div><div>为了避免这些问题，程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收，但不是必须马上回收，</div><div></div><div>一个是并不能解决内存资源耗空的局面，另外也会增加GC的消耗。</div><div></div><div>二、JVM内存区域组成</div><div></div><div>简单的说java中的堆和栈</div><div></div><div>java把内存分两种：一种是栈内存，另一种是堆内存</div><div></div><div>1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配；</div><div></div><div>2。堆内存用来存放由new创建的对象和数组</div><div></div><div>在函数（代码块）中定义一个变量时，java就在栈中为这个变量分配内存空间，当超过变量的作用域后，java会自动释放掉为该变量所分配的内存空间；在堆中分配的内存由java虚拟机的自动垃圾回收器来管理</div><div></div><div>堆的优势是可以动态分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存，存取速度较慢；</div><div></div><div>栈的优势是存取速度比堆要快，缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。</div><div></div><div>java堆分为三个区：New、Old和Permanent</div><div></div><div>GC有两个线程：</div><div></div><div>新创建的对象被分配到New区，当该区被填满时会被GC辅助线程移到Old区，当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。Old区的大小等于Xmx减去-Xmn</div><div></div><div>java栈存放</div><div></div><div>栈调整：参数有+UseDefaultStackSize -Xss256K，表示每个线程可申请256k的栈空间</div><div></div><div>每个线程都有他自己的Stack</div><div></div><div>三、JVM如何设置虚拟内存</div><div></div><div>提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。</div><div></div><div>提示：Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。</div><div></div><div>提示：JVM初始分配的内存由-Xms指定，默认是物理内存的1/64；JVM最大分配的内存由-Xmx指定，默认是物理内存的1/4。</div><div></div><div>默认空余堆内存小于40%时，JVM就会增大堆直到-Xmx的最大限制；空余堆内存大于70%时，JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。</div><div></div><div>提示：假设物理内存无限大的话，JVM内存的最大值跟操作系统有很大的关系。</div><div></div><div>简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制，</div><div></div><div>这个限制一般是2GB-3GB（一般来说Windows系统下为1.5G-2G，Linux系统下为2G-3G），而64bit以上的处理器就不会有限制了</div><div></div><div>提示：注意：如果Xms超过了Xmx值，或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。</div><div></div><div>提示：设置NewSize、MaxNewSize相等，"new"的大小最好不要大于"old"的一半，原因是old区如果不够大会频繁的触发"主" GC ，大大降低了性能</div><div></div><div>JVM使用-XX:PermSize设置非堆内存初始值，默认是物理内存的1/64；</div><div></div><div>由XX:MaxPermSize设置最大非堆内存的大小，默认是物理内存的1/4。</div><div></div><div>解决方法：手动设置Heap size</div><div></div><div>修改TOMCAT_HOME/bin/catalina.bat</div><div></div><div>在&#8220;echo "Using CATALINA_BASE: $CATALINA_BASE"&#8221;上面加入以下行：</div><div></div><div>JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"</div><div></div><div>四、性能检查工具使用</div><div></div><div>定位内存泄漏：</div><div></div><div>JProfiler工具主要用于检查和跟踪系统（限于Java开发的）的性能。JProfiler可以通过时时的监控系统的内存使用情况，随时监视垃圾回收，线程运行状况等手段，从而很好的监视JVM运行情况及其性能。</div><div></div><div>1. 应用服务器内存长期不合理占用，内存经常处于高位占用，很难回收到低位；</div><div></div><div>2. 应用服务器极为不稳定，几乎每两天重新启动一次，有时甚至每天重新启动一次；</div><div></div><div>3. 应用服务器经常做Full GC(Garbage Collection)，而且时间很长，大约需要30-40秒，应用服务器在做Full GC的时候是不响应客户的交易请求的，非常影响系统性能。</div><div></div><div>因为开发环境和产品环境会有不同，导致该问题发生有时会在产品环境中发生，通常可以使用工具跟踪系统的内存使用情况，在有些个别情况下或许某个时刻确实是使用了大量内存导致out of memory，这时应继续跟踪看接下来是否会有下降，</div><div></div><div>如果一直居高不下这肯定就因为程序的原因导致内存泄漏。</div><div></div><div>五、不健壮代码的特征及解决办法</div><div></div><div>1、尽早释放无用对象的引用。好的办法是使用临时变量的时候，让引用变量在退出活动域后，自动设置为null，暗示垃圾收集器来收集该对象，防止发生内存泄露。</div><div></div><div>对于仍然有指针指向的实例，jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾，提高GC回收机制效率；</div><div></div><div>2、我们的程序里不可避免大量使用字符串处理，避免使用String，应大量使用StringBuffer，每一个String对象都得独立占用内存一块区域；</div><div></div><div>String str = "aaa";</div><div></div><div>String str2 = "bbb";</div><div></div><div>String str3 = str + str2;//假如执行此次之后str ,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销；</div><div></div><div>3、尽量少用静态变量，因为静态变量是全局的，GC不会回收的；</div><div></div><div>4、避免集中创建对象尤其是大对象，JVM会突然需要大量内存，这时必然会触发GC优化系统内存环境；显示的声明数组空间，而且申请数量还极大。</div><div></div><div>这是一个案例想定供大家警戒</div><div></div><div>使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误，</div><div></div><div>检查之后发现问题：组件里的代码</div><div></div><div>m_totalBytes = m_request.getContentLength();</div><div></div><div>m_binArray = new byte[m_totalBytes];</div><div></div><div>问题原因是totalBytes这个变量得到的数极大，导致该数组分配了很多内存空间，而且该数组不能及时释放。解决办法只能换一种更合适的办法，至少是不会引发outofMemoryError的方式解决。参考：http://bbs.xml.org.cn/blog/more.asp?name=hongrui&amp;id=3747</div><div></div><div>5、尽量运用对象池技术以提高系统性能；生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏，例如大集合对象拥有大数据量的业务对象的时候，可以考虑分块进行处理，然后解决一块释放一块的策略。</div><div></div><div>6、不要在经常调用的方法中创建对象，尤其是忌讳在循环中创建对象。可以适当的使用hashtable，vector 创建一组对象容器，然后从容器中去取那些对象，而不用每次new之后又丢弃</div><div></div><div>7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据，造成 Out Of Memory Error 的状况，这时就大概要计算一下数据量的最大值是多少，并且设定所需最小及最大的内存空间值。</div></div></div><br /></a></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/357737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-01 14:46 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/01/357737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 内存分配（转载）</title><link>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357734.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Thu, 01 Sep 2011 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357734.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357734.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/09/01/357734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357734.html</trackback:ping><description><![CDATA[文章来源：<a href="http://developer.51cto.com/art/201009/225071_1.htm">http://developer.51cto.com/art/201009/225071_1.htm<br /><div style="display: inline-block; "><div><span class="Apple-style-span" style="color: #333333; font-family: 宋体; line-height: 28px; "><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">一般Java在内存分配时会涉及到以下区域：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;寄存器：我们在程序中无法控制</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;栈：存放基本类型的数据和对象的引用，但对象本身不存放在栈中，而是存放在堆中</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;堆：存放用new产生的数据</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;静态域：存放在对象中用static定义的静态成员</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;常量池：存放常量</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;非RAM存储：硬盘等永久存储空间</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">Java内存分配中的栈</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。<br style="clear: both; width: 0px; height: 0px; " />&nbsp;&nbsp;<br style="clear: both; width: 0px; height: 0px; " />当在一段代码块定义一个变量时，Java就在栈中 为这个变量分配内存空间，当该变量退出该作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">Java内存分配中的堆</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">堆内存用来存放由new创建的对象和数组。 在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">在堆中产生了一个数组或对象后，还可以 在栈中定义一个特殊的变量，让栈中这个变量的取值等于数组或对象在堆内存中的首地址，栈中的这个变量就成了数组或对象的引用变量。&nbsp; 引用变量就相当于是 为数组或对象起的一个名称，以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">引用变量是普通的变量，定义时在栈中分配，引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配，即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外，数组和对象本身占据的内存不会被释放，数组和对象在没有引用变量指向它的时候，才变为垃圾，不能在被使用，但仍 然占据内存空间不放，在随后的一个不确定的时间被垃圾回收器收走（释放掉）。这也是 Java 比较占内存的原因。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><span style="font-family: 黑体; ">实际上，栈中的变量指向堆内存中的变量，这就是Java中的指针</span>！<br style="clear: both; width: 0px; height: 0px; " />&nbsp;<br style="clear: both; width: 0px; height: 0px; " /><strong style="font-weight: bold; text-align: center; ">常量池 (constant pool)</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">常量池指的是在编译期被确定，并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型（如int、long等等）和对象型（如String及数组）的常量值(final)还包含一些以文本形式出现的符号引用，比如：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;类和接口的全限定名；</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;字段的名称和描述符；</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">&#9670;方法和名称和描述符。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和，包括直接常量（string,integer和 floating point常量）和对其他类型，字段和方法的符号引用。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">对于String常量，它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的， 对于String类型，有一张固定长度的CONSTANT_String_info表用来存储文字字符串值，注意：该表只存储文字字符串值，不存储符号引 用。说到这里，对常量池中的字符串值的存储位置应该有一个比较明了的理解了。<br style="clear: both; width: 0px; height: 0px; " />在程序执行的时候,常量池 会储存在Method Area,而不是堆中。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">堆与栈</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、 anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存 大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态 分配内存，存取速度较慢。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是 确定的，缺乏灵活性。栈中主要存放一些基本类型的变量数据（int, short, long, byte, float, double, boolean, char）和对象句柄(引用)。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义：</p><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; font-family: 'Courier New', monospace; font-size: 12px; width: 591px; overflow-x: auto; overflow-y: auto; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #e6e6e6; background-position: initial initial; background-repeat: initial initial; "><ol class="dp-j" style="margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 1px !important; margin-left: 55px; padding-top: 5px; padding-right: 0px; padding-bottom: 5px; padding-left: 0px; color: #5c5c5c; list-style-type: decimal; list-style-position: initial; list-style-image: initial; word-wrap: break-word; word-break: normal; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f7f7f7; background-position: initial initial; background-repeat: initial initial; "><li class="alt" style="margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; color: inherit; list-style-type: decimal; list-style-position: outside !important; list-style-image: none; word-wrap: break-word; word-break: normal; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; "><span class="keyword" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: #006699; background-color: inherit; font-weight: bold; ">int</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; ">&nbsp;a&nbsp;=&nbsp;</span><span class="number" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: #c00000; background-color: inherit; ">3</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; ">;&nbsp; &nbsp;</span></span></li><li style="margin-top: 0px !important; margin-right: 0px !important; margin-bottom: 0px !important; margin-left: 0px !important; padding-top: 0px !important; padding-right: 3px !important; padding-bottom: 0px !important; padding-left: 10px !important; color: #5c5c5c; list-style-type: decimal; list-style-position: outside !important; list-style-image: none; word-wrap: break-word; word-break: normal; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; background-image: url(http://images.51cto.com/images/art1105/images/0.gif); background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: transparent; line-height: 18px; background-position: -498px -70px; background-repeat: no-repeat repeat; "><span class="keyword" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: #006699; background-color: inherit; font-weight: bold; ">int</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; ">&nbsp;b&nbsp;=&nbsp;</span><span class="number" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: #c00000; background-color: inherit; ">3</span><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; color: black; background-color: inherit; ">；&nbsp;&nbsp;</span></li></ol></pre><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">这时，如果再令 a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响 到b的值。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; text-indent: 28px; background-color: transparent; ">要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。<br /><br /><div><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">总结</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">堆中存放使用new关键字创建的对象.</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好，存放在字符串常 量池中，而有的是运行时才被创建.使用new关键字，存放在堆中。</p></div><br /></p></span></div></div><br /></a><img src ="http://www.blogjava.net/GavinMiao/aggbug/357734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-09-01 14:37 <a href="http://www.blogjava.net/GavinMiao/archive/2011/09/01/357734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>注解参考</title><link>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357524.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 29 Aug 2011 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357524.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357524.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357524.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2011/08/29/357524.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/357524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-08-29 18:20 <a href="http://www.blogjava.net/GavinMiao/archive/2011/08/29/357524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置内存大小</title><link>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357501.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 29 Aug 2011 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357501.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357501.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357501.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357501.html</trackback:ping><description><![CDATA[<div><div>tomcat bin catalina.bat</div><div>在最上面添加这样一句：</div><div>set JAVA_OPTS=-Xms512m-Xmx1024m</div><div>set CATALINA_OPTS=-Xms512m-Xmx1024m</div><div>加入的位置在rem-----------------------这条语句之后</div><div>eg：</div><div><div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">原语句：&nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">set JAVA_OPTS=%JAVA_OPTS% &nbsp; -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"&nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">修改后语句：&nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">set JAVA_OPTS=%JAVA_OPTS% -Xms256m -Xmx512m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"&nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">添加部分&nbsp;</div><div style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">set JAVA_OPTS=-Xms256m -Xmx512m</div></div></div><div></div><div>在Eclipse中改tomcat JVM 内存, 运行Eclipse中配置的Tomcat.&nbsp;</div><div>在server配置, tomcat5.x-&gt;jdk, 在Java VM arguments 里添加:&nbsp;</div><div>-Xms256m -Xmx512m 达到一样的效果.&nbsp;<br /><br />&nbsp; &nbsp; 以下为转载的一篇文章：<a href="http://developer.51cto.com/art/201009/228062.htm">http://developer.51cto.com/art/201009/228062.htm</a><div><span style="color: #333333; font-family: 宋体; line-height: 28px; "><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">如何设置Tomcat的JVM内存大小</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">Tomcat本身不能直接在计算机上运行，需要依赖于硬件基础之上的操作系统和一个JVM。JAVA程序启动时JVM都会分配一个初始JVM内存和最大JVM内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候，JVM是要先去做垃圾回收的动作，释放被占用的一些内存。所以想调整Tomcat的启动时初始内存和最大内存就需要向JVM声明，一般的JAVA程序在运行都可以通过中-Xms-Xmx来调整应用程序的初始内存和最大内存:</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">这两个值的大小一般根据需要进行设置。初始化堆的大小执行了虚拟机在启动时向系统申请的内存的大小。一般而言，这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存，此时这个参数就是显得非常重要，如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化，虚拟机就必须重复地增加内存来满足使用。由于这种原因，我们一般把-Xms和-Xmx设为一样大，而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象，内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出，并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用JVM内存的最大值的80%。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">Tomcat默认可以使用的内存为128MB，在较大型的应用项目中，这点内存是不够的，需要调大。有以下几种方法可以选用：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">第一种方法：</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">Windows下，在文件/bin/catalina.bat，Unix下，在文件/bin/catalina.sh的前面，增加如下设置：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">JAVA_OPTS='-Xms【初始化内存大小】-Xmx【可以使用的最大内存】'</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">需要把这个两个参数值调大。例如：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">JAVA_OPTS='-Xms256m-Xmx512m'</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">表示初始化内存为256MB，可以使用的最大内存为512MB。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">第二种方法：环境变量中设</strong></p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">变量名：JAVA_OPTS</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">变量值：-Xms512m-Xmx512m</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; "><strong style="font-weight: bold; text-align: center; ">第三种方法：</strong>前两种方法针对的是bin目录下有catalina.bat的情况（比如直接解压的Tomcat等），但是有些安装版的Tomcat下没有catalina.bat，这个时候可以采用如下方法，当然这个方法也是最通用的方法：</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">打开tomcatHome/\bin/\tomcat5w.exe，点击Java选项卡，然后将会发现其中有这么两项：Initialmemorypool和Maximummemorypool.Initialmemorypool这个就是初始化设置的内存的大小。Maximummemorypool这个是最大JVM内存的大小设置完了就按确定然后再重启TOMCAT你就会发现tomcat中jvm可用的内存改变了。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">另外需要考虑的是Java提供的垃圾回收机制。虚拟机的堆大小决定了虚拟机花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关，应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大，那么完全垃圾收集就会很慢，但是频度会降低。如果你把堆的大小和内存的需要一致，完全收集就很快，但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间，以在特定的时间内最大化处理客户的请求。在基准测试的时候，为保证最好的性能，要把堆的大小设大，保证垃圾收集不在整个基准测试的过程中出现。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">如果系统花费很多的时间收集垃圾，请减小堆大小。一次完全的垃圾收集应该不超过3-5秒。如果垃圾收集成为瓶颈，那么需要指定代的大小，检查垃圾收集的详细输出，研究垃圾收集参数对性能的影响。一般说来，你应该使用物理内存的80%作为堆大小。当增加处理器时，记得增加内存，因为分配可以并行进行，而垃圾收集不是并行的。</p><p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #333333; background-color: transparent; text-indent: 28px; ">一个要注意的地方：建议把内存的最高值跟最低值的差值缩小，不然会浪费很多内存的，最低值加大，最高值可以随便设，但是要根据实际的物理内存，如果内存设置太大了,比如设置了512M最大内存,但如果没有512M可用内存,Tomcat就不能启动，还有可能存在内存被系统回收，终止进程的情况。</p></span></div></div><div></div><div></div></div><img src ="http://www.blogjava.net/GavinMiao/aggbug/357501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-08-29 14:49 <a href="http://www.blogjava.net/GavinMiao/archive/2011/08/29/357501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础知识总结</title><link>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357491.html</link><dc:creator>GavinMiao</dc:creator><author>GavinMiao</author><pubDate>Mon, 29 Aug 2011 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357491.html</guid><wfw:comment>http://www.blogjava.net/GavinMiao/comments/357491.html</wfw:comment><comments>http://www.blogjava.net/GavinMiao/archive/2011/08/29/357491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/GavinMiao/comments/commentRss/357491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/GavinMiao/services/trackbacks/357491.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/GavinMiao/archive/2011/08/29/357491.html'>阅读全文</a><img src ="http://www.blogjava.net/GavinMiao/aggbug/357491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/GavinMiao/" target="_blank">GavinMiao</a> 2011-08-29 13:39 <a href="http://www.blogjava.net/GavinMiao/archive/2011/08/29/357491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>