﻿<?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-csusky-随笔分类-JAVA基础</title><link>http://www.blogjava.net/csusky/category/29483.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 16 May 2008 09:15:24 GMT</lastBuildDate><pubDate>Fri, 16 May 2008 09:15:24 GMT</pubDate><ttl>60</ttl><item><title>JDK1.5的自动装箱功能</title><link>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 16 May 2008 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/200842.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/05/16/200842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/200842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/200842.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">在JAVA JDK1.5以后具有的自动装箱与拆箱的功能，所谓的自动装箱<br clear="all" />
与拆箱也就是把基本的数据类型自动的转为封装类型。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">如：自动装箱，它可以直接把基本类型赋值给封装类型</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer num = 10 ;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Double d = 2d ;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">自动拆箱，它可以把封装类型赋值给基本类型</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">int num = new Integer(10);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">double d = new Double(2d);</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">自动装箱与拆箱的功能事实上是编译器来帮您的忙，编译器在编译时期依您所编写的语法，决定是否进行装箱或拆箱动作。在自动装箱时对于值从-128到127之间的值，它们被装箱为Integer对象后，会存在内存中被重用，所以范例4.6中使用==进行比较时，i1 与 i2实际上参考至同一个对象。如果超过了从-128到127之间的值，被装箱后的Integer对象并不会被重用，即相当于每次装箱时都新建一个Integer对象，所以范例4.7使用==进行比较时，i1与i2参考的是不同的对象。所以不要过分依赖自动装箱与拆箱，您还是必须知道基本数据类型与对象的差异。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">public void testBoxingUnboxing() {</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 10;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer inta = i;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inta++;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inta += 1;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = inta;</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(j == inta);</span><span style="color: blue">结果是：</span><span style="color: blue">true</span><span style="color: red">//junit</span><span style="color: red">里面的方法</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(j == new Integer(j)); </span><span style="color: blue">结果是：</span><span style="color: blue">true</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue(10000 == new Integer(10000)); </span><span style="color: blue">结果是：</span><span style="color: blue">true</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; }</span></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = 100.相当于编译器自动为您作以下的语法编译：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = new Integer(100).所以自动装箱与拆箱的功能是所谓的&#8220;编译器蜜糖&#8221;(Compiler Sugar)，虽然使用这个功能很方便，但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = null.int j = i.这样的语法在编译时期是合法的，但是在运行时期会有错误，因为这种写法相当于：</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = null.int j = i.intValue().null表示i没有参考至任何的对象实体，它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象，所以也就不可能操作intValue()方法，这样上面的写法在运行时会出现NullPointerException错误。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">自动装箱、拆箱的功能提供了方便性，但隐藏了一些细节，所以必须小心。再来看范例4.6，您认为结果是什么呢？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">&#220;. </span><span style="color: red">范例</span><span style="color: red">4.6 AutoBoxDemo2.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo2 { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public static void main(String[] args) { <br />
Integer i1 = 100;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 100; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1 == i2) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2");</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"). </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">从自动装箱与拆箱的机制来看，可能会觉得结果是显示i1 == i2，您是对的。那么范例4.7的这个程序，您觉得结果是什么？</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">&#220;. </span><span style="color: #ff6600">范例</span><span style="color: #ff6600">4.7 AutoBoxDemo3.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo3 { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public static void main(String[] args) { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i1 = 200;</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1 == i2) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2");</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><strong><span style="color: red">结果是显示</span><span style="color: red">i1 != i2</span></strong><strong><span style="color: red">，</span></strong>这有些令人惊讶，两个范例语法完全一样，只不过改个数值而已，结果却相反。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">其实这与==运算符的比较有关，在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等，事实上==也用于判断两个对象引用名称是否参考至同一个对象。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">在自动装箱时对于值从</span><span style="color: #ff6600">&#8211;128</span><span style="color: #ff6600">到</span><span style="color: #ff6600">127</span><span style="color: #ff6600">之间的值，它们被装箱为</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象后，会存在内存中被重用，所以范例</span><span style="color: #ff6600">4.6</span><span style="color: #ff6600">中使用</span><span style="color: #ff6600">==</span><span style="color: #ff6600">进行比较时，</span><span style="color: #ff6600">i1 </span><span style="color: #ff6600">与</span><span style="color: #ff6600"> i2</span><span style="color: #ff6600">实际上参考至同一个对象。如果超过了从</span><span style="color: #ff6600">&#8211;128</span><span style="color: #ff6600">到</span><span style="color: #ff6600">127</span><span style="color: #ff6600">之间的值，被装箱后的</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象并不会被重用，即相当于每次装箱时都新建一个</span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象，所以范例</span><span style="color: #ff6600">4.7</span><span style="color: #ff6600">使用</span><span style="color: #ff6600">==</span><span style="color: #ff6600">进行比较时，</span><span style="color: #ff6600">i1</span><span style="color: #ff6600">与</span><span style="color: #ff6600">i2</span><span style="color: #ff6600">参考的是不同的对象。</span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">所以不要过分依赖自动装箱与拆箱，您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写，而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">&#220;. </span><span style="color: red">范例</span><span style="color: red">4.8 AutoBoxDemo4.java </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">public class AutoBoxDemo4 { <br />
public static void main(String[] args) { </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i1 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">Integer i2 = 200; </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">if (i1.equals(i2)) </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 == i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">else </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">System.out.println("i1 != i2"); </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">} </span></span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><strong>结果这次是显示<span style="color: red">i1 == i2</span></strong><strong>。</strong>使用这样的写法，相信也会比较放心一些，对于这些方便但隐藏细节的功能到底要不要用呢？基本上只有一个原则：如果您不确定就不要用。</span></p>
<img src ="http://www.blogjava.net/csusky/aggbug/200842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-05-16 11:33 <a href="http://www.blogjava.net/csusky/archive/2008/05/16/200842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库的事务 JDBC</title><link>http://www.blogjava.net/csusky/archive/2008/03/05/183845.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Wed, 05 Mar 2008 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/03/05/183845.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/183845.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/03/05/183845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/183845.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/183845.html</trackback:ping><description><![CDATA[TRANSACTION_NONE:<br />
&nbsp;&nbsp;正式地讲，TRANSACTION_NONE不是一个有效的事务级别。<br />
&nbsp;&nbsp;根据java.sql Connection API文件，这个级别表示事务是<br />
&nbsp;&nbsp;不被支持的，因此理论上说你不能使用TRANSACTION_NONE作<br />
&nbsp;&nbsp;为一个自变量赋给Connection.setTransactionIsolation()<br />
&nbsp;&nbsp;方法。事实上，虽然一些数据库实施了这个事务级别，但是<br />
&nbsp;&nbsp;Oracle9i却没有实施。
<p><br />
&nbsp;脏读取(TRANSACTION_READ_UNCOMMITTE):<br />
<span style="color: #ff0000">（允许的操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读-读&nbsp; 读-写 写-读&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（脏数据，不可重复读，虚读）&nbsp;）</span><br />
&nbsp;&nbsp; 表示,这个事务级别<br />
&nbsp;&nbsp;允许读取脏数据,什么是脏数据?就是指还没有提交的数据.<br />
&nbsp;&nbsp;因为这个级别,是允许一个事务(A)读取另一个事务(B)<br />
&nbsp;&nbsp;还没有提交的数据.一旦事务B发生异常退出.而修改了的数据<br />
&nbsp;&nbsp;却还没提交,或者新插入的数据和删除了的数据都还没有<br />
&nbsp;&nbsp;提交,导致事务A拿到了一些脏数据,或者错误数据;<br />
&nbsp;&nbsp;因此在这个事务级别里是会发生脏读,重复读,错误读取;</p>
<p>&nbsp;禁止脏读(TRANSACTION_READ_COMMITTED):<br />
<span style="color: #ff0000">（允许的操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读-读&nbsp; 读-写 （不可重复读，虚读））</span><br />
&nbsp; 在这个级别中,事务A<br />
&nbsp;&nbsp;只能读取一些提交的数据,如事务B添加了一条记录,但是<br />
&nbsp;&nbsp;如果事务B没有提交,那么事务A是读不到的,所以该事务级别,<br />
&nbsp;&nbsp;把脏读给屏蔽掉了.---却允许重复读取,和错误读取.</p>
<p>&nbsp;&nbsp;什么是重复读取呢?譬如,事务A读取了一个数据,这个数据<br />
&nbsp;&nbsp;的值为"helloworld",事务A准备利用这个数据来更新一下<br />
&nbsp;&nbsp;其他数据,但这个时候事务B开始对这个数据进行修改,并且<br />
&nbsp;&nbsp;提交---"hello 无名氏",由于是已经提交了,所以事务A是可以<br />
&nbsp;&nbsp;看到这个数据的,当事务A在没提交事务之前,它想看下数据<br />
&nbsp;&nbsp;是否正确,这个时候它发现,新读出的数据已经和原来的数据<br />
&nbsp;&nbsp;不一样了(这就是重复读取);<br />
</p>
<p><br />
<br />
<br />
&nbsp;允许重复读取(TRANSACTION_REPEATABLE_READ):<br />
<span style="color: #ff0000">（允许的操作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 读-读&nbsp; 读-写（仅允许插入，不允许删除和修改）（虚读））</span><br />
&nbsp; 在这个级别中,<br />
&nbsp;&nbsp;是禁止了脏读,和取消了不可重复读取,但是没有禁止错误读取;<br />
&nbsp;&nbsp;这个级别的事务比较严格,当一个事务A在读取一个值的时候<br />
&nbsp;&nbsp;是不允许另一个事务对该值进行修改的;<br />
&nbsp;&nbsp;为了允许重复读取,可以选用该级别,因为TRANSACTION_READ_<br />
&nbsp;&nbsp;COMMITED这个事务级别,是允许重复读取提交的数据的,如果<br />
&nbsp;&nbsp;事务A在读取一个数值的时候,值为"Hello World!",但这个时<br />
&nbsp;&nbsp;候事务B对"Hello World"值进行修改了,改为"Hello EveryOne"<br />
&nbsp;&nbsp;然后提交,当事务A再次去读取这个值的时候,去发现原来读到<br />
&nbsp;&nbsp;的值改变了,变成了"Hello EveryOne",为了防止出现这种情况<br />
&nbsp;&nbsp;可以禁止重复提交,目的是为了重复读取不会出错!那么这个<br />
&nbsp;&nbsp;时候就可以选择<br />
TRANSACTION_REPEATABLE_READ这个级别,<br />
&nbsp;&nbsp;这个级别就是用来禁止重复提交的.<br />
<span style="color: #ff0000">（实际上是加了行锁，锁定了选中的数据，不允许修改，但是允许插入新的数据）<br />
</span>&nbsp;&nbsp;虽然这个时候是禁止了重复提交,但却可以添加删除,<br />
&nbsp;&nbsp;比如事务A,作了个查询语句"select * from 无名氏 "; 这个时候是允许事务B做这样的操作的:<br />
&nbsp;&nbsp;"insert into&nbsp;无名氏 values(2,'aaa')"; 这个时候,<br />
&nbsp;&nbsp;事务A再次做读取操作的时候,却发现数据莫名其妙的<br />
&nbsp;&nbsp;多了一条,这就是所谓的---幻影读取;<br />
</p>
<p><br />
<br />
<br />
&nbsp;禁止幻读(TRANSACTION_SERIALIZABLE):<br />
&nbsp;事务的最高级别<span style="color: #ff0000">(串行化&nbsp;&nbsp;操作)</span>事务级别最高,所耗费的性能也越多.<br />
&nbsp;&nbsp;禁止幻读禁止了脏读,禁止了重复提交和幻读.<br />
&nbsp;&nbsp;也就是当事务A在按条件查询的时候,事务A一旦没有提<br />
&nbsp;&nbsp;交,任何事务都不能对事务A的资源进行操作--- 保证<br />
&nbsp;&nbsp;事务A的操作真正的原子性!</p>
<p><br />
&nbsp;注意:在Oracle中只支持两种级别:</p>
<p>&nbsp;&nbsp;TRANSACTION_READ_COMMITTED(默认的级别)(只有提交后<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;才可以读取)而每一个终端进行自己的DML操作 都自动开启了一个事务</p>
<p>&nbsp;&nbsp;TRANSACTION_SERIALIZABLE(窜行化操作)</p>
<img src ="http://www.blogjava.net/csusky/aggbug/183845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-03-05 09:34 <a href="http://www.blogjava.net/csusky/archive/2008/03/05/183845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串池</title><link>http://www.blogjava.net/csusky/archive/2008/03/04/183608.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 04 Mar 2008 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/03/04/183608.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/183608.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/03/04/183608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/183608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/183608.html</trackback:ping><description><![CDATA[Java运行环境有一个字符串池，由String类维护。执行语句String str="abc"时，首先查看字符串池中是否存在字符串"abc"，如果存在则直接将"abc"赋给str，如果不存在则先在字符串池中新建一个字符串"abc"，然后再将其赋给str。执行语句String str=new String("abc")时，不管字符串池中是否存在字符串"abc"，直接新建一个字符串"abc"（注意：新建的字符串"abc"不是在字符串池中），然后将其付给str。前一语句的效率高，后一语句的效率低，因为新建字符串占用内存空间。String str = new String()创建了一个空字符串，与String str=new String("")相同。 <br />
<br />
<pre>public <a title="java.lang 中的类" href="mk:@MSITStore:d:\user\089256\桌面\JDK_API_1_6_zh_CN.CHM::/java/lang/String.html">String</a> <strong>intern</strong>()</pre>
<dl>
<dd>返回字符串对象的规范化表示形式。
<p>一个初始为空的字符串池，它由类 <code>String</code> 私有地维护。
<p>当调用 intern 方法时，如果池已经包含一个等于此 <code>String</code> 对象的字符串（用 <a href="mk:@MSITStore:d:\user\089256\桌面\JDK_API_1_6_zh_CN.CHM::/java/lang/String.html#equals(java.lang.Object)"><code>equals(Object)</code></a> 方法确定），则返回池中的字符串。否则，将此 <code>String</code> 对象添加到池中，并返回此 <code>String</code> 对象的引用。
<p>它遵循以下规则：对于任意两个字符串 <code>s</code> 和 <code>t</code>，当且仅当 <code>s.equals(t)</code> 为 <code>true</code> 时，<code>s.intern()&nbsp;==&nbsp;t.intern()</code> 才为 <code>true</code>。 <br />
</p>
</dd></dl>
<p>&nbsp; String.intern(); <br />
再补充介绍一点：存在于.class文件中的常量池，在运行期间被jvm装载，并且可以扩充。String的intern()方法就是扩充常量池的一个方法；当一个String实例str调用intern()方法时，java查找常量池中是否有相同unicode的字符串常量，如果有，则返回其引用，如果没有，则在常量池中增加一个unicode等于str的字符串并返回它的引用。 <br />
例3： <br />
String &nbsp; s0=&#8221;kvill&#8221;; <br />
String &nbsp; s1=new &nbsp; String(&#8220;kvill&#8221;); <br />
String &nbsp; s2=new &nbsp; String(&#8220;kvill&#8221;); <br />
System.out.println(s0==s1); <br />
S1.intern(); <br />
S2=s2.intern(); <br />
System.out.println(s0==s1); <br />
System.out.prntln(s0==s1.intern()); <br />
System.out.println(s0==s2); <br />
结果为： <br />
False <br />
False &nbsp; //虽然执行了s1.intern()，但它的返回值没有赋给s1 <br />
True <br />
True <br />
最后再破除一个错误的理解： <br />
有人说，&#8220;使用String.intern()方法可以将一个String类保存到一个全局的String表中，如果具有相同值的unicode字符串已经在这个表中，那么该方法返回表中已有字符串的地址，如果在表中没有相同值的字符串，则将自己的地址注册到表中&#8221;如果把这个全局的String表理解为常量吃的话，最后一句话&#8220;如果在表中没有相同值的字符串，则将自己的地址注册到表中&#8221;是错的。 <br />
例4： <br />
String &nbsp; s1=new &nbsp; String(&#8220;kvill&#8221;); <br />
String &nbsp; s2=s1.intern(); <br />
System.out.println(s1==s1.intern()); <br />
System.out.println(s1+&#8221; &nbsp; &#8221;+s2); <br />
System.out.println(s2==s1.intern()); <br />
结果是： <br />
False <br />
Kvill &nbsp; kvill <br />
True <br />
我们没有声明一个&#8221;kvill&#8221;常量，所以常量池中一开始没有&#8221;kvill&#8221;的，当我们调用s1.intern()后就在常量池中新添加了一个&#8221;kvill&#8221;常量，原来的不在常量池中的&#8221;kvill&#8221;仍然存在，也就不是&#8220;把自己的地址注册到常量池中&#8221;了。 <br />
例5： <br />
String &nbsp; str1=&#8221;java&#8221;; <br />
String &nbsp; str2=&#8221;blog&#8221;; <br />
String &nbsp; s=str1+str2; <br />
System.out.println(s==&#8221;javablog&#8221;); <br />
结果是false。Jvm确实对型如String &nbsp; str1=&#8221;java&#8221;;的String对象放在常量池里，但是它是在编译时那么做的，而String &nbsp; s=str1+str2;是在运行时刻才能知道，也就是说str1+str2是在堆里创建的，所以结果为false了。 <br />
<br />
<br />
比较两个已经存在于字符串池中字符串对象可以用"=="进行，拥有比equals操作符更快的速度</p>
<img src ="http://www.blogjava.net/csusky/aggbug/183608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-03-04 09:40 <a href="http://www.blogjava.net/csusky/archive/2008/03/04/183608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的异常处理</title><link>http://www.blogjava.net/csusky/archive/2008/02/26/182211.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 26 Feb 2008 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/02/26/182211.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/182211.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/02/26/182211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/182211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/182211.html</trackback:ping><description><![CDATA[<p>在JAVA中，如果某个方法不能够按照正常的途径完成它的任务，就可以通过另外一个途径退出方法。在这种情况下，方法并不立刻返回，而是抛出一个封装了错误信息的对象。需要注意的是，这个方法将会立刻退出，且并不返回正常情况下的值。此外，调用这个方法的代码也将无法执行，取而代之的是，异常处理机制开始搜索能够处理这种错误条件的异常处理器。<br />
<br />
如果在子类中覆盖了超类的一个方法，那么子类方法声明的已检查异常不能超过超类方法中声明的异常围。（也就是说子类中抛出的异常范围更小或者根本不抛出异常）。需要说明的是，如果超类方法没有抛出任何异常，子类也不能抛出任何已检查异常。例如，如果覆盖JComponent.paintComponent()方法，那么&nbsp;&nbsp;&nbsp;&nbsp;由于超类中没有抛出任何异常，所以自定义的paintComponent()方法也不能抛出任何异常。<br />
<br />
如何抛出异常：<br />
譬如在读一个输入流时，如果期待的字节数为1024，而当读到700字节的时候遇到一个EOF信号，这是我们未预期的，正是我们要抛出的异常，下面就是抛出改异常的语句</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_38_154_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_154_Open_Text.style.display='none'; Codehighlighter1_38_154_Closed_Image.style.display='inline'; Codehighlighter1_38_154_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_154_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_154_Closed_Text.style.display='none'; Codehighlighter1_38_154_Open_Image.style.display='inline'; Codehighlighter1_38_154_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">String&nbsp;readData()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;EOFException&nbsp;</span><span id="Codehighlighter1_38_154_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_38_154_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_55_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_152_Open_Text.style.display='none'; Codehighlighter1_55_152_Closed_Image.style.display='inline'; Codehighlighter1_55_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_55_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_55_152_Closed_Text.style.display='none'; Codehighlighter1_55_152_Open_Image.style.display='inline'; Codehighlighter1_55_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(<img alt="" src="http://www.blogjava.net/Images/dot.gif" />)&nbsp;</span><span id="Codehighlighter1_55_152_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_55_152_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_81_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_146_Open_Text.style.display='none'; Codehighlighter1_81_146_Closed_Image.style.display='inline'; Codehighlighter1_81_146_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_81_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_81_146_Closed_Text.style.display='none'; Codehighlighter1_81_146_Open_Image.style.display='inline'; Codehighlighter1_81_146_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">in.hasNext())&nbsp;</span><span id="Codehighlighter1_81_146_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_81_146_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(n</span><span style="color: #000000">&lt;</span><span style="color: #000000">len)<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;EOFException();<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>这是抛出已存在标准的异常，步骤为：<br />
1.找到一个合适的异常类<br />
2.创建该类的对象<br />
3.将异常抛出<br />
一旦抛出异常，该方法就不可能返回到调用者，这就意味着不必为返回的默认值或错误代码担忧了。<br />
<br />
在程序中可能会遇到任何标准异常都无法正确描述清楚的问题，这时候就需要定义自己的异常类，定义自己的异常类需要继承自Exception 或者其子类，如继承自IOException&nbsp; 一般要为自定义的Exception定义两个构造函数，一个是默认的无参的构造函数，另一个是带一个描述详细错误信息String的构造函数（超类的toString（）方法会打印出这些详细信息。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_45_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_45_132_Open_Text.style.display='none'; Codehighlighter1_45_132_Closed_Image.style.display='inline'; Codehighlighter1_45_132_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_45_132_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_45_132_Closed_Text.style.display='none'; Codehighlighter1_45_132_Open_Image.style.display='inline'; Codehighlighter1_45_132_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyException&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_45_132_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_45_132_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_67_68_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_68_Open_Text.style.display='none'; Codehighlighter1_67_68_Closed_Image.style.display='inline'; Codehighlighter1_67_68_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_68_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_67_68_Closed_Text.style.display='none'; Codehighlighter1_67_68_Open_Image.style.display='inline'; Codehighlighter1_67_68_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;MyException&nbsp;()&nbsp;</span><span id="Codehighlighter1_67_68_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_67_68_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img id="Codehighlighter1_105_130_Open_Image" onclick="this.style.display='none'; Codehighlighter1_105_130_Open_Text.style.display='none'; Codehighlighter1_105_130_Closed_Image.style.display='inline'; Codehighlighter1_105_130_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_105_130_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_105_130_Closed_Text.style.display='none'; Codehighlighter1_105_130_Open_Image.style.display='inline'; Codehighlighter1_105_130_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;MyException&nbsp;(String&nbsp;info)&nbsp;</span><span id="Codehighlighter1_105_130_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_105_130_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(info);<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>现在就可以像使用标准Exception类一样使用自定义的Exception类了</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_37_147_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_147_Open_Text.style.display='none'; Codehighlighter1_37_147_Closed_Image.style.display='inline'; Codehighlighter1_37_147_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_147_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_147_Closed_Text.style.display='none'; Codehighlighter1_37_147_Open_Image.style.display='inline'; Codehighlighter1_37_147_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">String&nbsp;readData()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;MyException&nbsp;</span><span id="Codehighlighter1_37_147_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_37_147_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_51_145_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_145_Open_Text.style.display='none'; Codehighlighter1_51_145_Closed_Image.style.display='inline'; Codehighlighter1_51_145_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_51_145_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_51_145_Closed_Text.style.display='none'; Codehighlighter1_51_145_Open_Image.style.display='inline'; Codehighlighter1_51_145_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;()&nbsp;</span><span id="Codehighlighter1_51_145_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_51_145_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img id="Codehighlighter1_77_140_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_140_Open_Text.style.display='none'; Codehighlighter1_77_140_Closed_Image.style.display='inline'; Codehighlighter1_77_140_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_77_140_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_140_Closed_Text.style.display='none'; Codehighlighter1_77_140_Open_Image.style.display='inline'; Codehighlighter1_77_140_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">in.hasNext())&nbsp;</span><span id="Codehighlighter1_77_140_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_77_140_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(n</span><span style="color: #000000">&lt;</span><span style="color: #000000">len)<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyException();<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>可以用超类Throwable类的getMessage方法得到详细的错误描述信息。或者toString()方法打印该信息。<br />
<br />
捕获异常：<br />
如果语句exp1有可能抛出一个异常，或者说是调用了能够抛出一个异常的方法，那么我们可以在程序中捕获该异常</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_4_27_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_27_Open_Text.style.display='none'; Codehighlighter1_4_27_Closed_Image.style.display='inline'; Codehighlighter1_4_27_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_4_27_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_27_Closed_Text.style.display='none'; Codehighlighter1_4_27_Open_Image.style.display='inline'; Codehighlighter1_4_27_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_4_27_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4_27_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;exp1;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;exp2;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />.<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img id="Codehighlighter1_48_56_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_56_Open_Text.style.display='none'; Codehighlighter1_48_56_Closed_Image.style.display='inline'; Codehighlighter1_48_56_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_48_56_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_48_56_Closed_Text.style.display='none'; Codehighlighter1_48_56_Open_Image.style.display='inline'; Codehighlighter1_48_56_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_48_56_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_48_56_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;e.<br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>或者是并不捕获，再次抛出该异常<br />
<br />
再次抛出异常，异常链：<br />
可以在catch块中再次抛出新的异常，这样可以隐藏原始的错误细节</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_27_88_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_88_Open_Text.style.display='none'; Codehighlighter1_27_88_Closed_Image.style.display='inline'; Codehighlighter1_27_88_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_88_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_88_Closed_Text.style.display='none'; Codehighlighter1_27_88_Open_Image.style.display='inline'; Codehighlighter1_27_88_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException&nbsp;sqle)&nbsp;</span><span id="Codehighlighter1_27_88_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_27_88_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletException(</span><span style="color: #000000">"</span><span style="color: #000000">caused&nbsp;by&nbsp;SQLException&nbsp;</span><span style="color: #000000">"+e.getMessage()</span><span style="color: #000000">);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>另一种更好的方法<br />
既抛出高级的异常，又不会丢失原始的异常信息。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_26_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_26_128_Open_Text.style.display='none'; Codehighlighter1_26_128_Closed_Image.style.display='inline'; Codehighlighter1_26_128_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_26_128_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_26_128_Closed_Text.style.display='none'; Codehighlighter1_26_128_Open_Image.style.display='inline'; Codehighlighter1_26_128_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000">}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(SQLException&nbsp;sqle)&nbsp;</span><span id="Codehighlighter1_26_128_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_26_128_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Throwable&nbsp;ta</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ServletException(</span><span style="color: #000000">"</span><span style="color: #000000">caused&nbsp;by&nbsp;SQLException</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;ta.setCause(e);<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;ta;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />当捕获抛出的异常ta时，可以用ta.getCause(),得到原始的异常</span></div>
<p><br />
finally子句，发生三种情况时，会执行finally子句<br />
1.try代码正常执行<br />
2.try代码抛出一个在catch子句中捕获的异常<br />
3.try代码抛出一个未在catch子句中捕获的异常<br />
就是说无论异常如何，finally子句中的代码都会执行<br />
一般把一些资源回收的工作交给finally子句<br />
<br />
最好把try-catch块和try-finally块分开，这样可以提高代码的清晰度</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_4_77_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_77_Open_Text.style.display='none'; Codehighlighter1_4_77_Closed_Image.style.display='inline'; Codehighlighter1_4_77_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_4_77_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_77_Closed_Text.style.display='none'; Codehighlighter1_4_77_Open_Image.style.display='inline'; Codehighlighter1_4_77_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_4_77_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_4_77_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_13_46_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_46_Open_Text.style.display='none'; Codehighlighter1_13_46_Closed_Image.style.display='inline'; Codehighlighter1_13_46_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_13_46_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_13_46_Closed_Text.style.display='none'; Codehighlighter1_13_46_Open_Image.style.display='inline'; Codehighlighter1_13_46_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_13_46_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_13_46_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可能抛出IOException的语句</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img id="Codehighlighter1_56_75_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_75_Open_Text.style.display='none'; Codehighlighter1_56_75_Closed_Image.style.display='inline'; Codehighlighter1_56_75_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_56_75_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_56_75_Closed_Text.style.display='none'; Codehighlighter1_56_75_Open_Image.style.display='inline'; Codehighlighter1_56_75_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_56_75_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_56_75_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_100_106_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_106_Open_Text.style.display='none'; Codehighlighter1_100_106_Closed_Image.style.display='inline'; Codehighlighter1_100_106_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_100_106_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_100_106_Closed_Text.style.display='none'; Codehighlighter1_100_106_Open_Image.style.display='inline'; Codehighlighter1_100_106_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOExceotion&nbsp;e)&nbsp;</span><span id="Codehighlighter1_100_106_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_100_106_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>这样的另外一个好处是，可以catch到finally子句中抛出的异常。这也就引发了另外一个问题，如果在try和finally中都抛出了异常，而且是不同类型的，那么最后返回的是那一个呢？答案是finally中抛出的异常会覆盖try中抛出的异常。从而丢失了try当中抛出的异常信息，让抛出该方法的使用者不能跟踪异常信息。所以，在finally中执行的语句最好是不要抛出异常，但是不幸的是我们有时候不得不在finally中执行一些清楚操作如：关闭输入流InputStream,但是InputStream类的设计者并没有这么设计（将会抛出异常）。<br />
<br />
由于finally子句总是会执行，所以在finally中包含return值时，是很危险的。假设我们利用return语句从try中返回，在方法返回之前finally子句的内容将会被执行。如果finally子句当中也包含一个return 语句，那么这个return语句所返回的值，将会覆盖原先return的值。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_20_99_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_99_Open_Text.style.display='none'; Codehighlighter1_20_99_Closed_Image.style.display='inline'; Codehighlighter1_20_99_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_20_99_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_20_99_Closed_Text.style.display='none'; Codehighlighter1_20_99_Open_Image.style.display='inline'; Codehighlighter1_20_99_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;f(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)&nbsp;</span><span id="Codehighlighter1_20_99_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_20_99_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_28_52_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_52_Open_Text.style.display='none'; Codehighlighter1_28_52_Closed_Image.style.display='inline'; Codehighlighter1_28_52_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_28_52_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_28_52_Closed_Text.style.display='none'; Codehighlighter1_28_52_Open_Image.style.display='inline'; Codehighlighter1_28_52_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_28_52_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_28_52_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;n</span><span style="color: #000000">*</span><span style="color: #000000">n;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_62_97_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_97_Open_Text.style.display='none'; Codehighlighter1_62_97_Closed_Image.style.display='inline'; Codehighlighter1_62_97_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_62_97_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_97_Closed_Text.style.display='none'; Codehighlighter1_62_97_Open_Image.style.display='inline'; Codehighlighter1_62_97_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_62_97_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_62_97_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(n</span><span style="color: #000000">==</span><span style="color: #000000">2</span><span style="color: #000000">)<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<p>在这里如果调用i=f(2);那么i的值将会是2而不是期望的2*2=4<br />
<br />
<br />
最后最重要的一点，关于一个方法是捕获一个异常还是抛出给调用他的方法<br />
有一点规则&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp; <span style="color: #ff0000">早抛出，晚捕获，尽量把异常抛出给调用它的函数</span></strong><br />
<br />
</p>
<img src ="http://www.blogjava.net/csusky/aggbug/182211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-02-26 14:05 <a href="http://www.blogjava.net/csusky/archive/2008/02/26/182211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 的字符编码的问题</title><link>http://www.blogjava.net/csusky/archive/2008/02/24/181783.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Sun, 24 Feb 2008 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/02/24/181783.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/181783.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/02/24/181783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/181783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/181783.html</trackback:ping><description><![CDATA[<p>首先讲一讲字符集<br />
&nbsp;JDK1.4版本引入了java.nio包加入了Charset类来统一字符集的转换，字符集给出了双字节Unicode码序列与本地字符编码中采用的字节序列之间的映射<br />
字符集的名称不区分大小写，可以用官方名称或者任何一个别名调用静态方法forName来获得Charset<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Charset&nbsp;charset</span><span style="color: #000000">=</span><span style="color: #000000">Charset.forName(</span><span style="color: #000000">"GBK</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div>
Charset的aliases()方法返回一个Set&lt;String&gt;集合，表示该字符集所具有的所有别名<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Set</span><span style="color: #000000">&lt;</span><span style="color: #000000">String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;aliases</span><span style="color: #000000">=</span><span style="color: #000000">charset.aliases();</span></div>
查看虚拟机所支持的字符集以及名字可用Charset的静态方法availableCharsets()返回一个SortedMap<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Charset</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map</span><span style="color: #000000">=</span><span style="color: #000000">Charset.availableCharsets();<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_93_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_93_137_Open_Text.style.display='none'; Codehighlighter1_93_137_Closed_Image.style.display='inline'; Codehighlighter1_93_137_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_93_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_93_137_Closed_Text.style.display='none'; Codehighlighter1_93_137_Open_Image.style.display='inline'; Codehighlighter1_93_137_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(String&nbsp;setname:map.keySet())&nbsp;</span><span id="Codehighlighter1_93_137_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_93_137_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(setname);<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
一旦有了字符集，就可以用他在本地字符串和Unicode字节序列之间转换<br />
如下将一个字符串编码为gbk&nbsp;&nbsp;&nbsp; charset.encode(str)函数返回一个ByteBuffer对象<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">String&nbsp;str</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(</span><span style="color: #000000">"</span><span style="color: #000000">晓宇</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteBuffer&nbsp;&nbsp;buff&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;charset.encode(str);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;bytes</span><span style="color: #000000">=</span><span style="color: #000000">buff.array();</span></div>
同样，可以将刚才按照GBK方式编码的字节流解码为正确的字符流<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ByteBuffer&nbsp;by</span><span style="color: #000000">=</span><span style="color: #000000">ByteBuffer.wrap(bytes,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;bytes.length);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharBuffer&nbsp;cb</span><span style="color: #000000">=</span><span style="color: #000000">charset.decode(by);</span><span style="color: #008000">//</span><span style="color: #008000">返回一个CharBuffer对象，已经将字节数组转化为字符数组</span><span style="color: #008000"><br />
</span><span style="color: #008080">3</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">cb.toString());</span></div>
<p><br />
实际上String类中集成了Charset对象的使用，String类有两个用于编码和解码的函数</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;bytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.getBytes(</span><span style="color: #000000">"</span><span style="color: #000000">CharsetName</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将字符串str按照指定名称的Charset进行编码成字节数组</span><span style="color: #008000"><br />
</span><span style="color: #008080">2</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str2</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(bytes,</span><span style="color: #000000">"</span><span style="color: #000000">CharsetName</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将字节数组按照指定名称的Charset解码为字符串</span></div>
<p><br />
在输入输出流中有两个用于将字节流转化为指定编码格式的字符流的类&nbsp; InputStreamReader/OutputStreamReader<br />
这两个类是读写流和读写器的桥梁 用法如下</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">InputStreamReader&nbsp;isr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InputStreamReader(in,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">charsetname</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BufferedReader(isr);</span><span style="color: #008000">//</span><span style="color: #008000">加入一个BufferedReader，可以用到该类的readLine()</span></div>
<p>该用法在我的另外一篇socket备忘的里面体现了，可将网络传过来的utf-8格式编码的字节流正确的解码，以至于显示的时候不会出现乱码<br />
<br />
<br />
<br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/csusky/aggbug/181783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-02-24 16:44 <a href="http://www.blogjava.net/csusky/archive/2008/02/24/181783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOCKET基础  学习笔记</title><link>http://www.blogjava.net/csusky/archive/2008/02/22/181438.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 22 Feb 2008 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/02/22/181438.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/181438.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/02/22/181438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/181438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/181438.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;1package&nbsp;com;&nbsp;&nbsp;2&nbsp;&nbsp;3import&nbsp;java.io.BufferedReader;&nbsp;&nbsp;4import&nbsp;java.io.ByteArrayOutputStream;&nbsp;&nbsp;5import&nbsp;java.io.Filte...&nbsp;&nbsp;<a href='http://www.blogjava.net/csusky/archive/2008/02/22/181438.html'>阅读全文</a><img src ="http://www.blogjava.net/csusky/aggbug/181438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-02-22 16:26 <a href="http://www.blogjava.net/csusky/archive/2008/02/22/181438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字节数组和其他类型的转换</title><link>http://www.blogjava.net/csusky/archive/2008/02/22/181415.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Fri, 22 Feb 2008 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/02/22/181415.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/181415.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/02/22/181415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/181415.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/181415.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>//整数到字节数组的转换 <span style="display: none">软件测试专业网站:51Testing软件测试网 h$_g8Lbx g s</span><br />
&nbsp;&nbsp; public byte[] intToByte(int intValue) {<br />
<span style="display: none">O R-v0OS&amp;{;u0</span>&nbsp;&nbsp;&nbsp; byte[] result = new byte[4];<br />
<span style="display: none">e!sm#DN0</span>&nbsp;&nbsp;&nbsp; result[0] = (byte) ( (intValue &amp; 0xFF000000) &gt;&gt; 24);<span style="display: none">软件测试专业网站:51Testing软件测试网3e Ou-l*l</span><br />
&nbsp;&nbsp;&nbsp; result[1] = (byte) ( (intValue &amp; 0x00FF0000) &gt;&gt; 16);<span style="display: none">软件测试专业网站:51Testing软件测试网%F3hN!XoC</span><br />
&nbsp;&nbsp;&nbsp; result[2] = (byte) ( (intValue &amp; 0x0000FF00) &gt;&gt; 8);<br />
<span style="display: none">d"TS)ro;L`;A:eI0</span>&nbsp;&nbsp;&nbsp; result[3] = (byte) ( (intValue &amp; 0x000000FF));<span style="display: none">软件测试专业网站:51Testing软件测试网t1^O{;_,S"e `</span><br />
&nbsp;&nbsp;&nbsp; return result;<span style="display: none">软件测试专业网站:51Testing软件测试网q*~[? n M"i</span><br />
&nbsp; }</p>
<p>&nbsp; //字节数组到整数的转换 <span style="display: none">软件测试专业网站:51Testing软件测试网i f9``3@0LZK&amp;R</span><br />
&nbsp; public static int byteToInt(byte[] b) { <span style="display: none">软件测试专业网站:51Testing软件测试网Rb~,Ws"u1m</span><br />
public static int byteToInt(byte[] byteVal) {<br />
<span style="display: none">2X/cH bIM0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = 0;<span style="display: none">软件测试专业网站:51Testing软件测试网7e5~3p"J r\ _</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; byteVal.length; i++) {<br />
<span style="display: none">1i {T q a2eT V_.^!Q0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int tmpVal = (byteVal[i] &lt;&lt; (8 * (3 - i)));<br />
<span style="display: none">&amp;?x%pQ4_9T7k0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (i) {<span style="display: none">软件测试专业网站:51Testing软件测试网A P/u[ C,J&amp;FA#f</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:<span style="display: none">软件测试专业网站:51Testing软件测试网B,}\z`]8UU</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpVal = tmpVal &amp; 0xFF000000;<span style="display: none">软件测试专业网站:51Testing软件测试网*yS6X$y9n*md~</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<span style="display: none">piL/jY)lkZ?0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<span style="display: none">软件测试专业网站:51Testing软件测试网5D#YS%w3f X|g</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpVal = tmpVal &amp; 0x00FF0000;<span style="display: none">软件测试专业网站:51Testing软件测试网c?Iu I w</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<span style="display: none">软件测试专业网站:51Testing软件测试网~&amp;E3Vmp0_;}@</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:<br />
<span style="display: none">6j3t1F;iX+K4{0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpVal = tmpVal &amp; 0x0000FF00;<span style="display: none">软件测试专业网站:51Testing软件测试网5fD7H.i y R a/q</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
<span style="display: none">]5b:h MMa!K0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 3:<br />
<span style="display: none">)^~_.\A0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpVal = tmpVal &amp; 0x000000FF;<br />
<span style="display: none">t2}8J f7A E~eH2[0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<span style="display: none">软件测试专业网站:51Testing软件测试网\? d:MN#D#iN</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<span style="display: none">MJ:c.rxWE0X"e"^*@0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = result | tmpVal;<span style="display: none">软件测试专业网站:51Testing软件测试网9R lE\Q(g&amp;SAJ</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<span style="display: none">软件测试专业网站:51Testing软件测试网1ixe#~9]lyF},T</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<span style="display: none">软件测试专业网站:51Testing软件测试网d,d"L^/fC?*upX</span><br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp; //字符到字节转换 <br />
<span style="display: none">Q N"P6tq.b@~0</span>&nbsp; public static byte[] charToByte(char ch){ <span style="display: none">软件测试专业网站:51Testing软件测试网%]|X,~-vb'?$SU</span><br />
&nbsp;&nbsp;&nbsp; int temp=(int)ch; <span style="display: none">软件测试专业网站:51Testing软件测试网'L9cx"B:` Ak</span><br />
&nbsp;&nbsp;&nbsp; byte[] b=new byte[2]; <span style="display: none">软件测试专业网站:51Testing软件测试网2C8j1U/i1[ ls</span><br />
&nbsp;&nbsp;&nbsp; for (int i=b.length-1;i&gt;-1;i--){ <br />
<span style="display: none">'C3^]_V:qz0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = new Integer(temp&amp;0xff).byteValue();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将最高位保存在最低位 <span style="display: none">软件测试专业网站:51Testing软件测试网 |S`"I h%YQU\(g</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = temp &gt;&gt; 8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //向右移8位 <span style="display: none">软件测试专业网站:51Testing软件测试网!s/jv'Z2R</span><br />
&nbsp;&nbsp;&nbsp; } <span style="display: none">软件测试专业网站:51Testing软件测试网R+C:w4LY4Xu!M</span><br />
&nbsp;&nbsp;&nbsp; return b; <span style="display: none">软件测试专业网站:51Testing软件测试网%n+x/Y ZV`6T\</span><br />
&nbsp; } </p>
<p>&nbsp; //字节到字符转换 <span style="display: none">软件测试专业网站:51Testing软件测试网n:gg'^!_@NF p*@B</span><br />
&nbsp; public static char byteToChar(byte[] b){ <span style="display: none">软件测试专业网站:51Testing软件测试网(}xOQ:b</span><br />
&nbsp;&nbsp;&nbsp; int s=0; <br />
<span style="display: none">ZuYw~ac0</span>&nbsp;&nbsp;&nbsp; if(b[0]&gt;0) <span style="display: none">软件测试专业网站:51Testing软件测试网'Tsc(rq</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=b[0]; <span style="display: none">软件测试专业网站:51Testing软件测试网5G]%j*fg)wk$Z</span><br />
&nbsp;&nbsp;&nbsp; else <span style="display: none">软件测试专业网站:51Testing软件测试网q#i2kb@</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=256+b[0]; <br />
<span style="display: none">#iCo0kd+|i0</span>&nbsp;&nbsp;&nbsp; s*=256; <span style="display: none">软件测试专业网站:51Testing软件测试网X%Zn?-k9h5q</span><br />
&nbsp;&nbsp;&nbsp; if(b[1]&gt;0) <span style="display: none">软件测试专业网站:51Testing软件测试网(E0v"C(Bv4Q</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=b[1]; <br />
<span style="display: none">+{`z$m a R0</span>&nbsp;&nbsp;&nbsp; else <span style="display: none">软件测试专业网站:51Testing软件测试网D^j aODKA3T</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s+=256+b[1]; <span style="display: none">软件测试专业网站:51Testing软件测试网\ hv8We}U)b</span><br />
&nbsp;&nbsp;&nbsp; char ch=(char)s; <span style="display: none">软件测试专业网站:51Testing软件测试网#JLO"h;NH*AHb0LLt!m</span><br />
&nbsp;&nbsp;&nbsp; return ch; <span style="display: none">软件测试专业网站:51Testing软件测试网$g,Mu0?JT#Ef&amp;xi</span><br />
&nbsp; } </p>
<p>&nbsp; //浮点到字节转换 <br />
<span style="display: none">de4w8L-MpD8{\0</span>&nbsp; public static byte[] doubleToByte(double d){ <span style="display: none">软件测试专业网站:51Testing软件测试网,~9g3FuQ9q;sMCa</span><br />
&nbsp;&nbsp;&nbsp; byte[] b=new byte[8]; <span style="display: none">软件测试专业网站:51Testing软件测试网 UY:}1oV:\ {-uZ7Ed</span><br />
&nbsp;&nbsp;&nbsp; long l=Double.doubleToLongBits(d); <br />
<span style="display: none">ar8f3|"@b(g'L0</span>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;b.length;i++){ <br />
<span style="display: none">%t4roUTU;zgxI0</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=new Long(l).byteValue(); <span style="display: none">软件测试专业网站:51Testing软件测试网*I%@7R#} bb0P</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l=l&gt;&gt;8; <br />
<span style="display: none">E$^+\"u!h!Y3^0</span>&nbsp;&nbsp;&nbsp; } <span style="display: none">软件测试专业网站:51Testing软件测试网%])x)S)u)i,ul</span><br />
&nbsp;&nbsp;&nbsp; return b; <br />
<span style="display: none">n`(]3K k`0</span>&nbsp; } </p>
<p>&nbsp; //字节到浮点转换 <br />
<span style="display: none">KwV!^Kt2q#p j0</span>&nbsp; public static double byteToDouble(byte[] b){ <br />
<span style="display: none">:C.}9o GI9r0</span>&nbsp;&nbsp;&nbsp; long l; </p>
<p>&nbsp;&nbsp;&nbsp; l=b[0]; <span style="display: none">软件测试专业网站:51Testing软件测试网^4_/j4oL\*l b</span><br />
&nbsp;&nbsp;&nbsp; l&amp;=0xff; <span style="display: none">软件测试专业网站:51Testing软件测试网8x-fA;H.\</span><br />
&nbsp;&nbsp;&nbsp; l|=((long)b[1]&lt;&lt;8); <span style="display: none">软件测试专业网站:51Testing软件测试网P\Z9tk</span><br />
&nbsp;&nbsp;&nbsp; l&amp;=0xffff; <br />
<span style="display: none">u;A&amp;Vs3n.p]*K/B0</span>&nbsp;&nbsp;&nbsp; l|=((long)b[2]&lt;&lt;16); <br />
<span style="display: none">)_ ^,F\ n3o0</span>&nbsp;&nbsp;&nbsp; l&amp;=0xffffff; <br />
<span style="display: none">` z3~*PIe aMK0</span>&nbsp;&nbsp;&nbsp; l|=((long)b[3]&lt;&lt;24); <br />
<span style="display: none">DM!ldb&amp;|U(A*J0</span>&nbsp;&nbsp;&nbsp; l&amp;=0xffffffffl; <br />
<span style="display: none">'i)k yh\0</span>&nbsp;&nbsp;&nbsp; l|=((long)b[4]&lt;&lt;32); <span style="display: none">软件测试专业网站:51Testing软件测试网 T$D_Wr:M!_,E^a</span><br />
&nbsp;&nbsp;&nbsp; l&amp;=0xffffffffffl; </p>
<p>&nbsp;&nbsp;&nbsp; l|=((long)b[5]&lt;&lt;40); <span style="display: none">软件测试专业网站:51Testing软件测试网g3m+GN$_)J1h,F.^(u.H d</span><br />
&nbsp;&nbsp;&nbsp; l&amp;=0xffffffffffffl; <br />
<span style="display: none">,gJ&amp;o'u N7\Sp0</span>&nbsp;&nbsp;&nbsp; l|=((long)b[6]&lt;&lt;48); <br />
<span style="display: none">:m@s7\WCt+B0</span>&nbsp;&nbsp;&nbsp; l&amp;=0xffffffffffffffl; <br />
<span style="display: none">,x)T:eO e2d![0</span>&nbsp;&nbsp;&nbsp; l|=((long)b[7]&lt;&lt;56); <br />
<span style="display: none">}^MS.x%_7P0</span>&nbsp;&nbsp;&nbsp; return Double.longBitsToDouble(l); <span style="display: none">软件测试专业网站:51Testing软件测试网Q)at;{k9Tq</span><br />
&nbsp; }</p>
<img src ="http://www.blogjava.net/csusky/aggbug/181415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-02-22 15:06 <a href="http://www.blogjava.net/csusky/archive/2008/02/22/181415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TREEMAP的排序机制</title><link>http://www.blogjava.net/csusky/archive/2008/02/19/180690.html</link><dc:creator>晓宇</dc:creator><author>晓宇</author><pubDate>Tue, 19 Feb 2008 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/csusky/archive/2008/02/19/180690.html</guid><wfw:comment>http://www.blogjava.net/csusky/comments/180690.html</wfw:comment><comments>http://www.blogjava.net/csusky/archive/2008/02/19/180690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/csusky/comments/commentRss/180690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/csusky/services/trackbacks/180690.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1package&nbsp;com.sf;&nbsp;2&nbsp;3import&nbsp;java.text.CollationKey;&nbsp;4import&nbsp;java.text.Collator;&nbsp;5import&nbsp;java.util.Comparator;&nbsp;6import&nbsp;java.util.Map;&nbsp;7...&nbsp;&nbsp;<a href='http://www.blogjava.net/csusky/archive/2008/02/19/180690.html'>阅读全文</a><img src ="http://www.blogjava.net/csusky/aggbug/180690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/csusky/" target="_blank">晓宇</a> 2008-02-19 15:16 <a href="http://www.blogjava.net/csusky/archive/2008/02/19/180690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>