1. 程式人生 > >Java學習中,所遇到的一些問題及解決方案

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()

。當你僅僅需要一個位元組的資料時,length設定為1即可。

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開發手冊中的話)

此部落格持續更新中……