﻿<?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-BloveSaga-文章分类-希哈爪哇</title><link>http://www.blogjava.net/blovesaga/category/11878.html</link><description>在希腊帕尔纳斯山南坡上,有一个驰名世界的戴尔波伊神托所,在它的入口处的巨石上赫然锈刻着这样几个大字: 认识你自己!</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 02:39:08 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 02:39:08 GMT</pubDate><ttl>60</ttl><item><title>优柔寡断</title><link>http://www.blogjava.net/blovesaga/articles/50680.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Tue, 06 Jun 2006 02:29:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/articles/50680.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50680.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/articles/50680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50680.html</trackback:ping><description><![CDATA[     下面这个可怜的小程序并不能干脆的做决定。它的decisive方法将返回true。但是它也返回false。那么，它到底打印的是什么呢？甚至，合法吗?
<p>class Indecisive<br />{<br /> public static void main(String[] args)<br /> {<br />  System.out.println(decisive());<br /> }<br /> static boolean decisive()<br /> {<br />  try<br />  {<br />   return true;<br />  }<br />  finally<br />  {<br />   return false;<br />  }<br /> }<br />}<br />   你可能认为这个程序不合法。毕竟，decisive方法不能同时返回true和false。如果你尝试一下，就会发现它<br />编译时没有任何错误，并且它打印的是false。为什么呢?<br />    原因在于就是在：在一个try-finally语句中，finally语句块总是在控制权离开try语句块时执行。无论try<br />语句块是正常结束的，还是意外结束，情况都是如此。在一条语句或一个语句块抛出一个异常，或者对某个封闭类型语句执行了一个break或continue，或是像这个程序一样执行了一个return时，将发生意外结束。之所以称为意外结束，是因为它们阻止程序按顺序执行下面的语句。<br />    当try语句块和finally语句块都意外结束时，在try语句块中引发意外结束的原因将被丢弃，而整个try-finally<br />语句意外结束的原因将与finally语句块意外结束的原因相同。在这个程序中，在try语句块中的return语句所<br />引发的意外结束将被丢弃，而try-finally语句意外结束是由finally语句块中的return造成的。简单的讲，程序<br />尝试着(try)返回(return)true,但是它最终(finally)返回(return)的是false。<br />    总之，每一个finally语句块都应该正常结束，除非抛出不受检查的异常。千万不要用return,break,continue或throw来退出finally语句块，并且千万不要允许让受检查的异常传播到finally语句块之外。</p><img src ="http://www.blogjava.net/blovesaga/aggbug/50680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-06 10:29 <a href="http://www.blogjava.net/blovesaga/articles/50680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Multicast--转晕乎了吧</title><link>http://www.blogjava.net/blovesaga/articles/50287.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/articles/50287.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50287.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/articles/50287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50287.html</trackback:ping><description><![CDATA[
		<p>  转型用于将一种类型转换到另一种类型.看看下面的code运行后你猜会打印什么?<br /> public class Multicast<br />{<br /> public static void main(String[] args)<br /> {<br />  System.out.println((int)(char)(byte)-1);<br /> }<br />}<br /> 转,转,转，我给转晕了,从int数值-1开始,然后从int转换为byte,之后转为char,最后转型回int.第一个转型将数值从32为窄化到8位,第二个转型从8位拓宽为16位,最后从16位拓宽到32位.这个数值最终回到起点了吗?运行一看不就知道了吗?<br />Print:<br />F:\Java Develop&gt;javac Multicast.java</p>
		<p>F:\Java Develop&gt;java Multicast<br />65535<br />啊,这么会是65535?<br />oh,my god!有条规则: <font color="#0000ff">如果最初的数值类型是有符号的,那么就执行符号扩展;如果他是char,那么不管它将要被转换成什么类型,都执行另扩展.<br />   </font><font color="#000000">用这条规则来44看.因为byte是有符号的,所以在将byte数值-1转换成char时.会发生符号扩展.作为结果的char数值16位就都被置位了,因此它等于2^16-1(2的16次方减1),就是65535.从char到int的转型也是一个扩展,<br />用规则来说它将执行另扩展,而不是符号扩展.作为int的结果数值就是65535和打印的一样.<br />   从这个例子我们得到一个教训:</font><font color="#ffa500">如果通过观察不能确定程序将要做什么,那么它做的就很有可能不是你想要的.</font></p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/50287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 16:13 <a href="http://www.blogjava.net/blovesaga/articles/50287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>search zero</title><link>http://www.blogjava.net/blovesaga/articles/50281.html</link><dc:creator>blovesaga</dc:creator><author>blovesaga</author><pubDate>Sun, 04 Jun 2006 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/blovesaga/articles/50281.html</guid><wfw:comment>http://www.blogjava.net/blovesaga/comments/50281.html</wfw:comment><comments>http://www.blogjava.net/blovesaga/articles/50281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/blovesaga/comments/commentRss/50281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/blovesaga/services/trackbacks/50281.html</trackback:ping><description><![CDATA[
		<p>     blovesaga在一家小超级市场购买一个1.10元棒棒糖,但是他的钱报中都是两块一张的钞票.如果他用一张两块的钞票买这个棒棒糖,那么应该找给他多少零钱呢?<br />     编写一个程序解决这个问题.<br />code:<br />class Change<br />{<br /> public static void main(String[] args)<br /> {<br />  System.out.println(2.00-1.10);<br /> }<br />}</p>
		<p>       blovesage写下这段代码我们期望得到应该找回的零钞0.90,但是当运行后他发现数据不兑，运行结果为:0.8999999999999999,与预期的0.90不一样。为什么呢?搞了半天原因在于1.1这个数不能被精确的表示为一个double,因此被表示为最接近它的double值.该程序从2中减去这个值得.遗憾的是,这个结果打印出来并不是接近0.9的double值.这说明: <font color="#ff0000">并不是所有的小数都可以用二进制浮点数精确表示.二进制浮点对于货币计算是非常不适合的.<br /></font>      要解决这个问题有两个办法:一是使用某种整数类型,例如int或long,并且分单位来计算.如下:<br />System.out.println((200-110)+"fen");<br />结果为90分.二是使用执行小数运算的BigDecimal.它还可以通过JDBC与SQL DECIMAL类型进行互操作.这里需要注意的是: 一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double).后一个构造器将用它的参数值来创建一个实例.例如new BigDecimal(.1),它将返回一个BigDecimal,也即0.10000000000000000555111512312578270211815834041015625.正确使用我们就可以得到期望的结果0.90:<br />code:<br />import java.math.BigDecimal;<br />class Change<br />{<br /> public static void main(String[] args)<br /> {<br />  System.out.println(new BigDecimal("2.00").<br />                     subtract(new BigDecimal("1.10")));<br /> }<br />}<br />Print:<br />F:\Java Develop&gt;java Change<br />0.90<br /></p>
		<p> </p>
<img src ="http://www.blogjava.net/blovesaga/aggbug/50281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/blovesaga/" target="_blank">blovesaga</a> 2006-06-04 15:54 <a href="http://www.blogjava.net/blovesaga/articles/50281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>