Java学习中,所遇到的一些问题及解决方案
2017-10-30 16:52
260 查看
1、在使用BigDecimal数据类型做除法运算的时候,弹出如下异常:
问题出现的原因是:
a和b相除的结果不能使用一个有限的decimal数表示。
所以为了解决这个问题,我们应该给结果设置一个范围。代码如下
这个问题,我在网上也找过一些答案,如,有一个说给divide方法设置一个小数点精度,
2 在使用bytebuffer时,如果你想读取buffer中的byte,可以调用
3 在今天码代码的过程中,被指出有些代码有些冗余。
出现这种情况的原因,是因为自己对Buffer API的认识不足。
我在这里再列出几个API的小技巧吧。
①
②
③有时
…
4 对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐适应equals方法进行判断。(这一段引用的是阿里巴巴java开发手册中的话)
此博客持续更新中……
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中遇到的一些问题
- 我在学习Java时遇到的一些问题
- 关于java学习之中遇到的一些问题之:java.util.NoSuchElementException.
- 学习java所遇到的问题与解决方案记录
- java学习会遇到的一些问题!
- ubuntu学习遇到的一些问题解决方案汇总
- Java学习中遇到的一些问题
- 学习JAVA一个月来,所遇到的一些问题(不全)
- 学习JAVA语言过程中遇到了一些问题
- java web开发中遇到的问题及解决方案(个人学习日志,持续更新)
- 初步学习java时遇到的一些问题及对初学朋友们的鼓励
- 学习JAVA过程中遇到的一些低级问题备忘记录
- Java基础学习中必须清楚的一些问题
- 学习AJAX过程中遇到的一些问题
- 通过plsql 测试存储过程遇到的问题和学习到的一些基础知识整理
- Java赋值运算符(+=、-=、*=、/=)使用中遇到的一些问题
- C++学习中遇到的问题及其解决方案
- 在基于 Java 语言的编程中我们经常遇到的一些问题
- ISA的学习体会二:我做ISA服务器遇到的一些问题
- JAVA学习提高之----解决插入数据库时遇到的引号问题