??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久久亚洲,91亚洲精品第一综合不卡播放,亚洲中文字幕无码久久精品1http://m.tkk7.com/csusky/category/29483.htmlzh-cnFri, 16 May 2008 09:15:24 GMTFri, 16 May 2008 09:15:24 GMT60JDK1.5的自动装功?/title><link>http://m.tkk7.com/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://m.tkk7.com/csusky/archive/2008/05/16/200842.html</guid><wfw:comment>http://m.tkk7.com/csusky/comments/200842.html</wfw:comment><comments>http://m.tkk7.com/csusky/archive/2008/05/16/200842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/csusky/comments/commentRss/200842.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/csusky/services/trackbacks/200842.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">在JAVA JDK1.5以后h的自动装׃拆箱的功能,所谓的自动装箱<br clear="all" /> 与拆׃是把基本的数据cd自动的{为封装类型?/span></p> <p style="margin: 0cm 0cm 0pt"><span style="color: blue"><span style="font-size: 10pt">如:自动装箱Q它可以直接把基本类型赋值给装cd</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">自动拆箱Q它可以把封装类型赋值给基本cd</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">自动装箱与拆q功能事实上是~译器来帮您的忙Q编译器在编译时期依您所~写的语法,军_是否q行装箱或拆动作。在自动装箱时对于g-128?27之间的|它们被装׃ؓInteger对象后,会存在内存中被重用,所以范?.6中?=q行比较Ӟi1 ?i2实际上参考至同一个对象。如果超q了?128?27之间的|被装后的Integer对象q不会被重用Q即相当于每ơ装时都新Z个Integer对象Q所以范?.7使用==q行比较Ӟi1与i2参考的是不同的对象。所以不要过分依赖自动装׃拆箱Q您q是必须知道基本数据cd与对象的差异?/span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">    <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">        int i = 10;</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">        Integer inta = i;</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">        inta++;</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">        inta += 1;</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="color: blue"><span style="font-size: 10pt">        int j = inta;</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt"><span style="color: blue">        assertTrue(j == inta);</span><span style="color: blue">l果是:</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">        assertTrue(j == new Integer(j)); </span><span style="color: blue">l果是:</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">        assertTrue(10000 == new Integer(10000)); </span><span style="color: blue">l果是:</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">    }</span></span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = 100.相当于编译器自动为您作以下的语法~译Q?/span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = new Integer(100).所以自动装׃拆箱的功能是所谓的“~译器蜜p?#8221;(Compiler Sugar)Q虽然用这个功能很方便Q但在程序运行阶D|得了解Java的语义。例如下面的E序是可以通过~译的:</span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">Integer i = null.int j = i.q样的语法在~译时期是合法的Q但是在q行时期会有错误Q因U写法相当于Q?/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没有参考至M的对象实体,它可以合法地指定l对象参考名U。由于实际上iq没有参考至M的对象,所以也׃可能操作intValue()ҎQ这样上面的写法在运行时会出现NullPointerException错误?/span></p> <p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-size: 10pt">自动装箱、拆q功能提供了方便性,但隐藏了一些细节,所以必d心。再来看范例4.6Q您认ؓl果是什么呢Q?/span></p> <p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">Ü. </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 == i2Q您是对的。那么范?.7的这个程序,您觉得结果是什么?</span></p> <p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">Ü. </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">l果是显C?/span><span style="color: red">i1 != i2</span></strong><strong><span style="color: red">Q?/span></strong>q有些o人惊Ӟ两个范例语法完全一P只不q改个数D已Q结果却相反?/span></p> <p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt">其实q与==q算W的比较有关Q在W?章中介绍q?=是用来比较两个基本数据类型的变量值是否相{,事实?=也用于判断两个对象引用名U是否参考至同一个对象?/span></p> <p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: #ff6600">在自动装时对于g</span><span style="color: #ff6600">–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">q行比较Ӟ</span><span style="color: #ff6600">i1 </span><span style="color: #ff6600">?/span><span style="color: #ff6600"> i2</span><span style="color: #ff6600">实际上参考至同一个对象。如果超q了?/span><span style="color: #ff6600">–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">对象q不会被重用Q即相当于每ơ装时都新Z?/span><span style="color: #ff6600">Integer</span><span style="color: #ff6600">对象Q所以范?/span><span style="color: #ff6600">4.7</span><span style="color: #ff6600">使用</span><span style="color: #ff6600">==</span><span style="color: #ff6600">q行比较Ӟ</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">所以不要过分依赖自动装׃拆箱Q您q是必须知道基本数据cd与对象的差异。范?.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范?.7必须改写?.8才是正确的?/span></p> <p style="margin: 0cm 0cm 0pt"><span style="font-size: 10pt"><span style="color: red">Ü. </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>l果q次是显C?span style="color: red">i1 == i2</span></strong><strong>?/strong>使用q样的写法,怿也会比较攑ֿ一些,对于q些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不定׃要用?/span></p> <img src ="http://m.tkk7.com/csusky/aggbug/200842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/csusky/" target="_blank">晓宇</a> 2008-05-16 11:33 <a href="http://m.tkk7.com/csusky/archive/2008/05/16/200842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库的事务 JDBChttp://m.tkk7.com/csusky/archive/2008/03/05/183845.html晓宇晓宇Wed, 05 Mar 2008 01:34:00 GMThttp://m.tkk7.com/csusky/archive/2008/03/05/183845.htmlhttp://m.tkk7.com/csusky/comments/183845.htmlhttp://m.tkk7.com/csusky/archive/2008/03/05/183845.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/183845.htmlhttp://m.tkk7.com/csusky/services/trackbacks/183845.html   正式地讲QTRANSACTION_NONE不是一个有效的事务U别?br />   Ҏjava.sql Connection API文gQ这个别表CZ务是
  不被支持的,因此理论上说你不能用TRANSACTION_NONE?br />   Z个自变量赋给Connection.setTransactionIsolation()
  Ҏ。事实上Q虽然一些数据库实施了这个事务别,但是
  Oracle9i却没有实施?


 脏读?TRANSACTION_READ_UNCOMMITTE):
Q允许的操作       ??nbsp; ????nbsp;    Q脏数据Q不可重复读Q虚读) Q?/span>
   表示,q个事务U别
  允许d脏数?什么是脏数?是指还没有提交的数?
  因ؓq个U别,是允怸个事?A)d另一个事?B)
  q没有提交的数据.一旦事务B发生异常退?而修改了的数?br />   却还没提?或者新插入的数据和删除了的数据都还没有
  提交,D事务A拿到了一些脏数据,或者错误数?
  因此在这个事务别里是会发生脏读,重复?错误d;

 止脏读(TRANSACTION_READ_COMMITTED):
Q允许的操作       ??nbsp; ??Q不可重复读Q虚读)Q?/span>
  在这个别中,事务A
  只能d一些提交的数据,如事务Bd了一条记?但是
  如果事务B没有提交,那么事务A是读不到?所以该事务U别,
  把脏ȝ屏蔽掉了.---却允讔R复读?和错误读?

  什么是重复d?譬如,事务Ad了一个数?q个数据
  的gؓ"helloworld",事务A准备利用q个数据来更C?br />   其他数据,但这个时候事务B开始对q个数据q行修改,q且
  提交---"hello 无名?,׃是已l提交了,所以事务A是可?br />   看到q个数据?当事务A在没提交事务之前,它想看下数据
  是否正确,q个时候它发现,新读出的数据已经和原来的数据
  不一样了(q就是重复读?;




 允许重复d(TRANSACTION_REPEATABLE_READ):
Q允许的操作       ??nbsp; ?写(仅允许插入,不允许删除和修改Q(虚读Q)
  在这个别中,
  是禁止了脏读,和取消了不可重复d,但是没有止错误d;
  q个U别的事务比较严?当一个事务A在读取一个值的时?br />   是不允许另一个事务对该D行修改的;
  Z允许重复d,可以选用该?因ؓTRANSACTION_READ_
  COMMITEDq个事务U别,是允讔R复读取提交的数据?如果
  事务A在读取一个数值的时?gؓ"Hello World!",但这个时
  候事务B?Hello World"D行修改了,改ؓ"Hello EveryOne"
  然后提交,当事务A再次去读取这个值的时?d现原来读?br />   的值改变了,变成?Hello EveryOne",Z防止出现q种情况
  可以止重复提交,目的是ؓ了重复读取不会出?那么q个
  时候就可以选择
TRANSACTION_REPEATABLE_READq个U别,
  q个U别是用来止重复提交?
Q实际上是加了行锁,锁定了选中的数据,不允怿改,但是允许插入新的数据Q?br />   虽然q个时候是止了重复提?但却可以d删除,
  比如事务A,作了个查询语?select * from 无名?"; q个时候是允许事务B做这L操作?
  "insert into 无名?values(2,'aaa')"; q个时?
  事务A再次做读取操作的时?却发现数据莫名其妙的
  多了一?q就是所谓的---qdd;




 止q读(TRANSACTION_SERIALIZABLE):
 事务的最高?span style="color: #ff0000">(串行?nbsp; 操作)事务U别最?所耗费的性能也越?
  止q读止了脏?止了重复提交和q读.
  也就是当事务A在按条g查询的时?事务A一旦没有提
  ?M事务都不能对事务A的资源进行操?-- 保证
  事务A的操作真正的原子?


 注意:在Oracle中只支持两种U别:

  TRANSACTION_READ_COMMITTED(默认的?(只有提交?br />      才可以读?而每一个终端进行自qDML操作 都自动开启了一个事?/p>

  TRANSACTION_SERIALIZABLE(H行化操?



晓宇 2008-03-05 09:34 发表评论
]]>
字符串池http://m.tkk7.com/csusky/archive/2008/03/04/183608.html晓宇晓宇Tue, 04 Mar 2008 01:40:00 GMThttp://m.tkk7.com/csusky/archive/2008/03/04/183608.htmlhttp://m.tkk7.com/csusky/comments/183608.htmlhttp://m.tkk7.com/csusky/archive/2008/03/04/183608.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/183608.htmlhttp://m.tkk7.com/csusky/services/trackbacks/183608.html
public String intern()
q回字符串对象的规范化表CŞ式?

一个初始ؓI的字符串池Q它q String U有地维护?

当调?intern ҎӞ如果池已l包含一个等于此 String 对象的字W串Q用 equals(Object) Ҏ定Q,则返回池中的字符丌Ӏ否则,此 String 对象d到池中,q返回此 String 对象的引用?

它遵循以下规则:对于L两个字符?s ?tQ当且仅?s.equals(t) ?true Ӟs.intern() == t.intern() 才ؓ true?

  String.intern();
再补充介l一点:存在?class文g中的帔R池,在运行期间被jvm装蝲Qƈ且可以扩充。String的intern()Ҏ是扩充帔R池的一个方法;当一个String实例str调用intern()ҎӞjava查找帔R池中是否有相同unicode的字W串帔RQ如果有Q则q回其引用,如果没有Q则在常量池中增加一个unicode{于str的字W串q返回它的引用?
?Q?
String   s0=”kvill”;
String   s1=new   String(“kvill”);
String   s2=new   String(“kvill”);
System.out.println(s0==s1);
S1.intern();
S2=s2.intern();
System.out.println(s0==s1);
System.out.prntln(s0==s1.intern());
System.out.println(s0==s2);
l果为:
False
False   //虽然执行了s1.intern()Q但它的q回值没有赋ls1
True
True
最后再破除一个错误的理解Q?
有h_“使用String.intern()Ҏ可以一个StringcM存到一个全局的String表中Q如果具有相同值的unicode字符串已l在q个表中Q那么该Ҏq回表中已有字符串的地址Q如果在表中没有相同值的字符Ԍ则将自己的地址注册到表?#8221;如果把这个全局的String表理解ؓ帔R吃的话,最后一句话“如果在表中没有相同值的字符Ԍ则将自己的地址注册到表?#8221;是错的?
?Q?
String   s1=new   String(“kvill”);
String   s2=s1.intern();
System.out.println(s1==s1.intern());
System.out.println(s1+”   ”+s2);
System.out.println(s2==s1.intern());
l果是:
False
Kvill   kvill
True
我们没有声明一?#8221;kvill”帔RQ所以常量池中一开始没?#8221;kvill”的,当我们调用s1.intern()后就在常量池中新d了一?#8221;kvill”帔RQ原来的不在帔R池中?#8221;kvill”仍然存在Q也׃?#8220;把自q地址注册到常量池?#8221;了?
?Q?
String   str1=”java”;
String   str2=”blog”;
String   s=str1+str2;
System.out.println(s==”javablog”);
l果是false。Jvm实对型如String   str1=”java”;的String对象攑֜帔R池里Q但是它是在~译旉么做的,而String   s=str1+str2;是在q行时刻才能知道Q也是说str1+str2是在堆里创徏的,所以结果ؓfalse了?


比较两个已经存在于字W串池中字符串对象可以用"=="q行Q拥有比equals操作W更快的速度



晓宇 2008-03-04 09:40 发表评论
]]>
JAVA中的异常处理http://m.tkk7.com/csusky/archive/2008/02/26/182211.html晓宇晓宇Tue, 26 Feb 2008 06:05:00 GMThttp://m.tkk7.com/csusky/archive/2008/02/26/182211.htmlhttp://m.tkk7.com/csusky/comments/182211.htmlhttp://m.tkk7.com/csusky/archive/2008/02/26/182211.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/182211.htmlhttp://m.tkk7.com/csusky/services/trackbacks/182211.html在JAVA中,如果某个Ҏ不能够按照正常的途径完成它的dQ就可以通过另外一个途径退出方法。在q种情况下,Ҏq不立刻q回Q而是抛出一个封装了错误信息的对象。需要注意的是,q个Ҏ会立刻退出,且ƈ不返回正常情况下的倹{此外,调用q个Ҏ的代码也无法执行,取而代之的是,异常处理机制开始搜索能够处理这U错误条件的异常处理器?br />
如果在子cM覆盖了超cȝ一个方法,那么子类Ҏ声明的已查异怸能超q超cL法中声明的异常围。(也就是说子类中抛出的异常范围更小或者根本不抛出异常Q。需要说明的是,如果类Ҏ没有抛出M异常Q子cM不能抛出M已检查异常。例如,如果覆盖JComponent.paintComponent()ҎQ那?nbsp;   ׃类中没有抛ZQ何异常,所以自定义的paintComponent()Ҏ也不能抛ZQ何异常?br />
如何抛出异常Q?br /> 譬如在读一个输入流Ӟ如果期待的字节数?024Q而当d700字节的时候遇C个EOF信号Q这是我们未预期的,正是我们要抛出的异常Q下面就是抛出改异常的语?/p>
1String readData() throws EOFException {
2   while ({
3      if(!in.hasNext()) {
4          if(n<len)
5            throw new EOFException();
6     }
  
7  }

8}

q是抛出已存在标准的异常Q步骤ؓQ?br /> 1.扑ֈ一个合适的异常c?br /> 2.创徏该类的对?br /> 3.异常抛?br /> 一旦抛出异常,该方法就不可能返回到调用者,q就意味着不必回的默认值或错误代码担忧了?br />
在程序中可能会遇CQ何标准异帔R无法正确描述清楚的问题,q时候就需要定义自q异常c,定义自己的异常类需要承自Exception 或者其子类Q如l承自IOException  一般要定义的Exception定义两个构造函敎ͼ一个是默认的无参的构造函敎ͼ另一个是带一个描q详l错误信息String的构造函敎ͼ类的toStringQ)Ҏ会打印出q些详细信息?/p>

1public class MyException extends IOException {
2
3    MyException () {}
4    
5    MyException (String info) {
6       super(info);
7   }

8}

现在可以像使用标准ExceptioncM样用自定义的ExceptioncM

1String readData() throws MyException {
2   while () {
3      if(!in.hasNext()) {
4          if(n<len)
5            throw new MyException();
6    }
  
7 }

8}

可以用超cThrowablecȝgetMessageҎ得到详细的错误描qC息。或者toString()Ҏ打印该信息?br />
捕获异常Q?br /> 如果语句exp1有可能抛Z个异常,或者说是调用了能够抛出一个异常的ҎQ那么我们可以在E序中捕莯异常

1try {
2 exp1;
3 exp2;
4 .
5
6}
 catch(Exception e) {
7   e.
8}

9

或者是q不捕获Q再ơ抛异常

再次抛出异常Q异帔RQ?br /> 可以在catch块中再次抛出新的异常Q这样可以隐藏原始的错误l节

1catch(SQLException sqle) {
2    throw new ServletException("caused by SQLException "+e.getMessage());
3}

另一U更好的Ҏ
既抛出高U的异常Q又不会丢失原始的异怿息?/p>

1}catch(SQLException sqle) 
2    Throwable ta=new ServletException("caused by SQLException");
3    ta.setCause(e);
4    throw ta;
5}

6当捕h出的异常taӞ可以用ta.getCause(),得到原始的异?/span>


finally子句Q发生三U情冉|Q会执行finally子句
1.try代码正常执行
2.try代码抛出一个在catch子句中捕L异常
3.try代码抛出一个未在catch子句中捕L异常
是说无论异常如何,finally子句中的代码都会执行
一般把一些资源回收的工作交给finally子句

最好把try-catch块和try-finally块分开Q这样可以提高代码的清晰?/p>

 1try {
 2   try {
 3      //可能抛出IOException的语?/span>
 4    }
 finally {
 5    is.close();
 6 }

 7}
 catch(IOExceotion e) {
 8   
 9}

10

q样的另外一个好处是Q可以catch到finally子句中抛出的异常。这也就引发了另外一个问题,如果在try和finally中都抛出了异常,而且是不同类型的Q那么最后返回的是那一个呢Q答案是finally中抛出的异常会覆盖try中抛出的异常。从而丢׃try当中抛出的异怿息,让抛Ҏ的用者不能跟t异怿息。所以,在finally中执行的语句最好是不要抛出异常Q但是不q的是我们有时候不得不在finally中执行一些清楚操作如Q关闭输入流InputStream,但是InputStreamcȝ设计者ƈ没有q么设计Q将会抛出异常)?br />
׃finally子句L会执行,所以在finally中包含return值时Q是很危险的。假设我们利用return语句从try中返回,在方法返回之前finally子句的内容将会被执行。如果finally子句当中也包含一个return 语句Q那么这个return语句所q回的|会覆盖原先return的倹{?/p>

1public int f(int n) {
2  try {
3      return n*n;
4    }
 finally {
5     if(n==2)
6       return 2;
7  }

8}

在这里如果调用i=f(2);那么i的值将会是2而不是期望的2*2=4


最后最重要的一点,关于一个方法是捕获一个异常还是抛出给调用他的Ҏ
有一点规?nbsp;  
                                早抛出,晚捕P量把异常抛出给调用它的函数



晓宇 2008-02-26 14:05 发表评论
]]>
JAVA 的字W编码的问题http://m.tkk7.com/csusky/archive/2008/02/24/181783.html晓宇晓宇Sun, 24 Feb 2008 08:44:00 GMThttp://m.tkk7.com/csusky/archive/2008/02/24/181783.htmlhttp://m.tkk7.com/csusky/comments/181783.htmlhttp://m.tkk7.com/csusky/archive/2008/02/24/181783.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/181783.htmlhttp://m.tkk7.com/csusky/services/trackbacks/181783.html首先讲一讲字W集
 JDK1.4版本引入了java.nio包加入了CharsetcLl一字符集的转换Q字W集l出了双字节Unicode码序列与本地字符~码中采用的字节序列之间的映?br /> 字符集的名称不区分大写Q可以用官方名称或者Q何一个别名调用静态方法forName来获得Charset

1Charset charset=Charset.forName("GBK");
Charset的aliases()Ҏq回一个Set<String>集合Q表C字符集所h的所有别?br />
Set<String> aliases=charset.aliases();
查看虚拟机所支持的字W集以及名字可用Charset的静态方法availableCharsets()q回一个SortedMap
1 Map<String,Charset> map=Charset.availableCharsets();
2            for(String setname:map.keySet()) {
3                System.out.println(setname);
4            }
一旦有了字W集Q就可以用他在本地字W串和Unicode字节序列之间转换
如下一个字W串~码为gbk    charset.encode(str)函数q回一个ByteBuffer对象
1String str=new String("晓宇");
2            ByteBuffer  buff = charset.encode(str);
3            byte[] bytes=buff.array();
同样Q可以将刚才按照GBK方式~码的字节流解码为正的字符?br />
1ByteBuffer by=ByteBuffer.wrap(bytes, 0, bytes.length);
2      CharBuffer cb=charset.decode(by);//q回一个CharBuffer对象Q已l将字节数组转化为字W数l?/span>
3      System.out.println("  "+cb.toString());


实际上StringcM集成了Charset对象的用,StringcL两个用于~码和解码的函数

1byte[] bytes = str.getBytes("CharsetName");  //字W串str按照指定名称的Charsetq行~码成字节数l?/span>
2            String str2=new String(bytes,"CharsetName"); //字节数l按照指定名U的Charset解码为字W串


在输入输出流中有两个用于字节流转化为指定编码格式的字符的c?nbsp; InputStreamReader/OutputStreamReader
q两个类是读写流和读写器的桥?用法如下

1InputStreamReader isr = new InputStreamReader(in, "charsetname");
2            BufferedReader br = new BufferedReader(isr);//加入一个BufferedReaderQ可以用到该cȝreadLine()

该用法在我的另外一socket备忘的里面体CQ可网l传q来的utf-8格式~码的字节流正确的解码,以至于显C的时候不会出Cؕ?br />






晓宇 2008-02-24 16:44 发表评论
]]>
SOCKET基础 学习W记http://m.tkk7.com/csusky/archive/2008/02/22/181438.html晓宇晓宇Fri, 22 Feb 2008 08:26:00 GMThttp://m.tkk7.com/csusky/archive/2008/02/22/181438.htmlhttp://m.tkk7.com/csusky/comments/181438.htmlhttp://m.tkk7.com/csusky/archive/2008/02/22/181438.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/181438.htmlhttp://m.tkk7.com/csusky/services/trackbacks/181438.html阅读全文

晓宇 2008-02-22 16:26 发表评论
]]>
字节数组和其他类型的转换http://m.tkk7.com/csusky/archive/2008/02/22/181415.html晓宇晓宇Fri, 22 Feb 2008 07:06:00 GMThttp://m.tkk7.com/csusky/archive/2008/02/22/181415.htmlhttp://m.tkk7.com/csusky/comments/181415.htmlhttp://m.tkk7.com/csusky/archive/2008/02/22/181415.html#Feedback0http://m.tkk7.com/csusky/comments/commentRss/181415.htmlhttp://m.tkk7.com/csusky/services/trackbacks/181415.html 

//整数到字节数l的转换 软g试专业|站:51Testing软g试|?h$_g8Lbx g s
   public byte[] intToByte(int intValue) {
O R-v0OS&{;u0    byte[] result = new byte[4];
e!sm#DN0    result[0] = (byte) ( (intValue & 0xFF000000) >> 24);软g试专业|站:51Testing软g试|?e Ou-l*l
    result[1] = (byte) ( (intValue & 0x00FF0000) >> 16);软g试专业|站:51Testing软g试|?F3hN!XoC
    result[2] = (byte) ( (intValue & 0x0000FF00) >> 8);
d"TS)ro;L`;A:eI0    result[3] = (byte) ( (intValue & 0x000000FF));软g试专业|站:51Testing软g试|?t1^O{;_,S"e `
    return result;软g试专业|站:51Testing软g试|?q*~[? n M"i
  }

  //字节数组到整数的转换 软g试专业|站:51Testing软g试|?i f9``3@0LZK&R
  public static int byteToInt(byte[] b) { 软g试专业|站:51Testing软g试|?Rb~,Ws"u1m
public static int byteToInt(byte[] byteVal) {
2X/cH bIM0      int result = 0;软g试专业|站:51Testing软g试|?e5~3p"J r\ _
      for (int i = 0; i < byteVal.length; i++) {
1i {T q a2eT V_.^!Q0        int tmpVal = (byteVal[i] << (8 * (3 - i)));
&?x%pQ4_9T7k0        switch (i) {软g试专业|站:51Testing软g试|?A P/u[ C,J&FA#f
          case 0:软g试专业|站:51Testing软g试|?B,}\z`]8UU
            tmpVal = tmpVal & 0xFF000000;软g试专业|站:51Testing软g试|?yS6X$y9n*md~
            break;
piL/jY)lkZ?0          case 1:软g试专业|站:51Testing软g试|?D#YS%w3f X|g
            tmpVal = tmpVal & 0x00FF0000;软g试专业|站:51Testing软g试|?c?Iu I w
            break;软g试专业|站:51Testing软g试|?~&E3Vmp0_;}@
          case 2:
6j3t1F;iX+K4{0            tmpVal = tmpVal & 0x0000FF00;软g试专业|站:51Testing软g试|?fD7H.i y R a/q
            break;
]5b:h MMa!K0          case 3:
)^~_.\A0            tmpVal = tmpVal & 0x000000FF;
t2}8J f7A E~eH2[0            break;软g试专业|站:51Testing软g试|?\? d:MN#D#iN
        }
MJ:c.rxWE0X"e"^*@0        result = result | tmpVal;软g试专业|站:51Testing软g试|?R lE\Q(g&SAJ
      }软g试专业|站:51Testing软g试|?ixe#~9]lyF},T
      return result;软g试专业|站:51Testing软g试|?d,d"L^/fC?*upX
    }

  //字符到字节{?
Q N"P6tq.b@~0  public static byte[] charToByte(char ch){ 软g试专业|站:51Testing软g试|?]|X,~-vb'?$SU
    int temp=(int)ch; 软g试专业|站:51Testing软g试|?L9cx"B:` Ak
    byte[] b=new byte[2]; 软g试专业|站:51Testing软g试|?C8j1U/i1[ ls
    for (int i=b.length-1;i>-1;i--){
'C3^]_V:qz0      b = new Integer(temp&0xff).byteValue();      //最高位保存在最低位 软g试专业|站:51Testing软g试|?|S`"I h%YQU\(g
      temp = temp >> 8;       //向右U??软g试专业|站:51Testing软g试|?s/jv'Z2R
    } 软g试专业|站:51Testing软g试|?R+C:w4LY4Xu!M
    return b; 软g试专业|站:51Testing软g试|?n+x/Y ZV`6T\
  }

  //字节到字W{?软g试专业|站:51Testing软g试|?n:gg'^!_@NF p*@B
  public static char byteToChar(byte[] b){ 软g试专业|站:51Testing软g试|?}xOQ:b
    int s=0;
ZuYw~ac0    if(b[0]>0) 软g试专业|站:51Testing软g试|?Tsc(rq
      s+=b[0]; 软g试专业|站:51Testing软g试|?G]%j*fg)wk$Z
    else 软g试专业|站:51Testing软g试|?q#i2kb@
      s+=256+b[0];
#iCo0kd+|i0    s*=256; 软g试专业|站:51Testing软g试|?X%Zn?-k9h5q
    if(b[1]>0) 软g试专业|站:51Testing软g试|?E0v"C(Bv4Q
      s+=b[1];
+{`z$m a R0    else 软g试专业|站:51Testing软g试|?D^j aODKA3T
      s+=256+b[1]; 软g试专业|站:51Testing软g试|?\ hv8We}U)b
    char ch=(char)s; 软g试专业|站:51Testing软g试|?JLO"h;NH*AHb0LLt!m
    return ch; 软g试专业|站:51Testing软g试|?g,Mu0?JT#Ef&xi
  }

  //点到字节{?
de4w8L-MpD8{\0  public static byte[] doubleToByte(double d){ 软g试专业|站:51Testing软g试|?~9g3FuQ9q;sMCa
    byte[] b=new byte[8]; 软g试专业|站:51Testing软g试|?UY:}1oV:\ {-uZ7Ed
    long l=Double.doubleToLongBits(d);
ar8f3|"@b(g'L0    for(int i=0;i<b.length;i++){
%t4roUTU;zgxI0      b=new Long(l).byteValue(); 软g试专业|站:51Testing软g试|?I%@7R#} bb0P
      l=l>>8;
E$^+\"u!h!Y3^0    } 软g试专业|站:51Testing软g试|?])x)S)u)i,ul
    return b;
n`(]3K k`0  }

  //字节到Q点{?
KwV!^Kt2q#p j0  public static double byteToDouble(byte[] b){
:C.}9o GI9r0    long l;

    l=b[0]; 软g试专业|站:51Testing软g试|?^4_/j4oL\*l b
    l&=0xff; 软g试专业|站:51Testing软g试|?x-fA;H.\
    l|=((long)b[1]<<8); 软g试专业|站:51Testing软g试|?P\Z9tk
    l&=0xffff;
u;A&Vs3n.p]*K/B0    l|=((long)b[2]<<16);
)_ ^,F\ n3o0    l&=0xffffff;
` z3~*PIe aMK0    l|=((long)b[3]<<24);
DM!ldb&|U(A*J0    l&=0xffffffffl;
'i)k yh\0    l|=((long)b[4]<<32); 软g试专业|站:51Testing软g试|?T$D_Wr:M!_,E^a
    l&=0xffffffffffl;

    l|=((long)b[5]<<40); 软g试专业|站:51Testing软g试|g3m+GN$_)J1h,F.^(u.H d
    l&=0xffffffffffffl;
,gJ&o'u N7\Sp0    l|=((long)b[6]<<48);
:m@s7\WCt+B0    l&=0xffffffffffffffl;
,x)T:eO e2d![0    l|=((long)b[7]<<56);
}^MS.x%_7P0    return Double.longBitsToDouble(l); 软g试专业|站:51Testing软g试|Q)at;{k9Tq
  }



晓宇 2008-02-22 15:06 发表评论
]]>
TREEMAP的排序机?/title><link>http://m.tkk7.com/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://m.tkk7.com/csusky/archive/2008/02/19/180690.html</guid><wfw:comment>http://m.tkk7.com/csusky/comments/180690.html</wfw:comment><comments>http://m.tkk7.com/csusky/archive/2008/02/19/180690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/csusky/comments/commentRss/180690.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/csusky/services/trackbacks/180690.html</trackback:ping><description><![CDATA[     摘要: 1package com.sf;  2  3import java.text.CollationKey;  4import java.text.Collator;  5import java.util.Comparator;  6import java.util.Map;  7...  <a href='http://m.tkk7.com/csusky/archive/2008/02/19/180690.html'>阅读全文</a><img src ="http://m.tkk7.com/csusky/aggbug/180690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/csusky/" target="_blank">晓宇</a> 2008-02-19 15:16 <a href="http://m.tkk7.com/csusky/archive/2008/02/19/180690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://by3142.com" target="_blank">ˬˬƬav</a>| <a href="http://wlzp88.com" target="_blank">þþþþAVվ </a>| <a href="http://fenxiangceo.com" target="_blank">޾ƷaĻ</a>| <a href="http://www-ttyx.com" target="_blank"></a>| <a href="http://yzddcpj.com" target="_blank">ٸaëƬ</a>| <a href="http://929119.com" target="_blank">av뾫Ʒ</a>| <a href="http://kmyake.com" target="_blank">ŮƵ</a>| <a href="http://ghdc5.com" target="_blank">91ƷѹƬ</a>| <a href="http://bjsunic.com" target="_blank">޹һ</a>| <a href="http://wwwpaogou123.com" target="_blank">ëƬ߲ѹۿ</a>| <a href="http://626393.com" target="_blank">ĻһƷ</a>| <a href="http://tqdrhj.com" target="_blank">޾ƷۺҰ </a>| <a href="http://www09191z.com" target="_blank">AƬ߹ۿ</a>| <a href="http://591se591se.com" target="_blank">һŷĻ</a>| <a href="http://517fanfan.com" target="_blank">AƬһ</a>| <a href="http://www759696b.com" target="_blank">91ۺ</a>| <a href="http://kyqp0033.com" target="_blank">ݲƵ</a>| <a href="http://727744.com" target="_blank">aƬѹۿƵ</a>| <a href="http://gzweida88.com" target="_blank">GVͬ߹ۿ</a>| <a href="http://9527paotui.com" target="_blank">޾Ʒmv߹ۿվ </a>| <a href="http://liulaogendawutai.com" target="_blank">þþþùɫAVѿͼƬ</a>| <a href="http://www-79983.com" target="_blank">þerƷѹۿ8</a>| <a href="http://woaianli.com" target="_blank">þAV뾫Ʒɫҹ</a>| <a href="http://chuadang.com" target="_blank">99ֻоƷ6</a>| <a href="http://tzntrip.com" target="_blank">ѾƷƵ</a>| <a href="http://bjhuicui.com" target="_blank">޾Ʒþǧն</a>| <a href="http://j2eesp.com" target="_blank">ݺݾþѹۿ</a>| <a href="http://wulegu.com" target="_blank">ԻȫƵַ</a>| <a href="http://xianzijie.com" target="_blank">ŮƵ</a>| <a href="http://www-63228.com" target="_blank">ҹƬѹۿ</a>| <a href="http://222mp3.com" target="_blank">Ļ߿</a>| <a href="http://xiamenwave.com" target="_blank">Ƶ</a>| <a href="http://lybb16.com" target="_blank">㽶Ƶһ</a>| <a href="http://jomujy.com" target="_blank">һëƬĻ</a>| <a href="http://by4471.com" target="_blank">޹Ʒþþþ</a>| <a href="http://langtuojidian.com" target="_blank">͹ƷƵƷ</a>| <a href="http://66h99.com" target="_blank">þֻоƷ10</a>| <a href="http://dslygc.com" target="_blank">þþþƷ2019ѹۿ</a>| <a href="http://www77753.com" target="_blank">йvideosԸ</a>| <a href="http://xsdggzs.com" target="_blank">һëƬ߹</a>| <a href="http://dcqzr.com" target="_blank">Ļ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>