|
class Indecisive
{
?public static void main(String[] args)
?{
??System.out.println(decisive());
?}
?static boolean decisive()
?{
??try
??{
???return true;
??}
??finally
??{
???return false;
??}
?}
}
???你可能認為這個程序不合法。畢竟,decisive方法不能同時返回true和false。如果你嘗試一下,就會發現它
編譯時沒有任何錯誤,并且它打印的是false。為什么呢?
??? 原因在于就是在:在一個try-finally語句中,finally語句塊總是在控制權離開try語句塊時執行。無論try
語句塊是正常結束的,還是意外結束,情況都是如此。在一條語句或一個語句塊拋出一個異常,或者對某個封閉類型語句執行了一個break或continue,或是像這個程序一樣執行了一個return時,將發生意外結束。之所以稱為意外結束,是因為它們阻止程序按順序執行下面的語句。
??? 當try語句塊和finally語句塊都意外結束時,在try語句塊中引發意外結束的原因將被丟棄,而整個try-finally
語句意外結束的原因將與finally語句塊意外結束的原因相同。在這個程序中,在try語句塊中的return語句所
引發的意外結束將被丟棄,而try-finally語句意外結束是由finally語句塊中的return造成的。簡單的講,程序
嘗試著(try)返回(return)true,但是它最終(finally)返回(return)的是false。
??? 總之,每一個finally語句塊都應該正常結束,除非拋出不受檢查的異常。千萬不要用return,break,continue或throw來退出finally語句塊,并且千萬不要允許讓受檢查的異常傳播到finally語句塊之外。
F:\Java Develop>java Multicast
65535
啊,這么會是65535?
oh,my god!有條規則: 如果最初的數值類型是有符號的,那么就執行符號擴展;如果他是char,那么不管它將要被轉換成什么類型,都執行另擴展.
?? 用這條規則來44看.因為byte是有符號的,所以在將byte數值-1轉換成char時.會發生符號擴展.作為結果的char數值16位就都被置位了,因此它等于2^16-1(2的16次方減1),就是65535.從char到int的轉型也是一個擴展,
用規則來說它將執行另擴展,而不是符號擴展.作為int的結果數值就是65535和打印的一樣.
?? 從這個例子我們得到一個教訓:如果通過觀察不能確定程序將要做什么,那么它做的就很有可能不是你想要的.
?Bill.Gate在一家小超級市場購買一個1.10元棒棒糖,但是他的錢報中都是兩塊一張的鈔票.如果他用一張兩塊的鈔票買這個棒棒糖,那么應該找給他多少零錢呢?
???? 編寫一個程序解決這個問題.
code:
class Change
{
?public static void main(String[] args)
?{
??System.out.println(2.00-1.10);
?}
}
?????? Bill.Gate寫下這段代碼我們期望得到應該找回的零鈔0.90,但是當運行后他發現數據不兌,運行結果為:0.8999999999999999,與預期的0.90不一樣。為什么呢?搞了半天原因在于1.1這個數不能被精確的表示為一個double,因此被表示為最接近它的double值.該程序從2中減去這個值得.遺憾的是,這個結果打印出來并不是接近0.9的double值.這說明: 并不是所有的小數都可以用二進制浮點數精確表示.二進制浮點對于貨幣計算是非常不適合的.
????? 要解決這個問題有兩個辦法:一是使用某種整數類型,例如int或long,并且分單位來計算.如下:
System.out.println((200-110)+"fen");
結果為90分.二是使用執行小數運算的BigDecimal.它還可以通過JDBC與SQL DECIMAL類型進行互操作.這里需要注意的是: 一定要用BigDecimal(String)構造器,而千萬不要用BigDecimal(double).后一個構造器將用它的參數值來創建一個實例.例如new BigDecimal(.1),它將返回一個BigDecimal,也即0.10000000000000000555111512312578270211815834041015625.正確使用我們就可以得到期望的結果0.90:
code:
import java.math.BigDecimal;
class Change
{
?public static void main(String[] args)
?{
??System.out.println(new BigDecimal("2.00").
???????????????????? subtract(new BigDecimal("1.10")));
?}
}
Print:
F:\Java Develop>java Change
0.90