Java學習中,所遇到的一些問題及解決方案
1、在使用BigDecimal資料型別做除法運算的時候,彈出如下異常:
public static void main(String[] args){
BigDecimal a = new BigDecimal(1000);
BigDecimal b = new BigDecimal(1500);
System.out.println(a.divide(b));
}
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1690)
at test.Test.main(Test.java:16)
問題出現的原因是:
a和b相除的結果不能使用一個有限的decimal數表示。
所以為了解決這個問題,我們應該給結果設定一個範圍。程式碼如下
public static void main(String[] args){
BigDecimal a = new BigDecimal(1000);
BigDecimal b = new BigDecimal(1500);
System.out .println(a.divide(b, 2, BigDecimal.ROUND_HALF_UP));
}
這個問題,我在網上也找過一些答案,如,有一個說給divide方法設定一個小數點精度,a.divide(b, 2)
,就那上面程式碼的值做輸入,得到的結果卻是1,很明顯這不一定是我們想要的答案。
2 在使用bytebuffer時,如果你想讀取buffer中的byte,可以呼叫buffer.readByte()
或buffer.readBytes(length)
。buffer.readByte()
直接返回一個位元組的資料,buffer.readBytes(length)
返回length個位元組的資料。在這裡,如果你需要的是一個array型的資料,你可以直接使用buffer.readBytes(length).array()
3 在今天碼程式碼的過程中,被指出有些程式碼有些冗餘。
public void test(){
String hexAltposi = "e8";
ChannelBuffer posi = ChannelBuffer.copiedBuffer(StrUtil.hexStringToBytes(hexAltposi));
//hexStringToBytes()是把hexAltposi由16進位制字串轉換成位元組
//希望從buffer中取出數,並轉化成int,先寫出之前的程式碼
System.out.println(Util.asInt(StrUtil.bytesToHexString(posi.readBytes(1).array())));
//再碼出現在的程式碼
System.out.prinlen((int) posi.readUnsignedByte());
}
出現這種情況的原因,是因為自己對Buffer API的認識不足。
我在這裡再列出幾個API的小技巧吧。
①buffer.readableBytes()
不會使buffer的讀取索引值增加或減少
②buffer.skipBytes(length)
會直接使buffer的讀取索引值增加length。當你的buffer中含有一些你用不知道 欄位或者在buffer的末尾有一些不用的欄位,可以直接使用此方法跳過。
③有時(int) buffer.readByte()
時讀取的資料會變成負的值,這裡需要使用(int) buffer.readUnsignedByte()
。
…
4 對於Integer var = ? 在-128至127範圍內的賦值,Integer物件是在IntegerCache.cache產生,會複用已有物件,這個區間內的Integer值可以直接使用==進行判斷,但是這個區間之外的所有資料,都會在堆上產生,並不會複用已有物件,這是一個大坑,推薦適應equals方法進行判斷。(這一段引用的是阿里巴巴java開發手冊中的話)
此部落格持續更新中……