2.23 不要讓類型默默轉換

</pre><pre name="code" class="java"><pre name="code" class="java">public class Client {
	// 光速是30萬公里/秒,常量
	public static final int LIGHT_SPEED = 30 * 10000 * 1000;
	public static void main(String[] args) {
		long dis1 = LIGHT_SPEED * 1;
		System.out.println("光速1s:" + dis1 + "米");
		long dis2 = LIGHT_SPEED * 60 * 8;
		System.out.println("光速8分鐘:" + dis2 + "米");
	}
}

打印結果:

光速1s:300000000米
光速8分鐘:-2028888064米
詭異,dis2已經考慮到int類型可能越界的問題,並使用了long型,但還是出現了負值。

因爲Java是先運算然後再進行類型轉換的,即是說運算的時候是以int類型運算,最後纔將類型轉換成long類型,所以會發生越界的情況。

解決辦法,只要加個"L"即可:

long dis2 = LIGHT_SPEED * 60L * 8;

這樣就徹底解決了越界問題,在實際開發中,更通用的做法是主動聲明式類型轉換(注意不是強制類型轉換),如:

long dis2 = 1L * LIGHT_SPEED * 60 * 8;

既然期望的結果是long類型,那就讓第一個參數與運算的參數也是long型。


注意:基本類型轉換時,使用主動聲明方式減少不必要的Bug


來源:《編寫高質量代碼:改善Java程序的151個建議》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章