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开发手册中的话)

此博客持续更新中……

你可能感兴趣的:(java)