Java 常用API x容易中招的几大坑

本文列举了Java编程中常见的陷阱和误区,包括精度损失、类型转换错误、单例模式实现问题、URL与URI的区别、日期格式理解误区、数据类型边界问题等,提醒开发者注意这些潜在的编程风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. int i =10;

Math.round(i) == i ?  => 90% 多的时候都不等,round() 参数为float型,故 round(0)会把参数提升为float, 然后再四舍五入,失了精度。

2.  ()?():() 使用时,尽量不要有不同的类型混着用, 会产生不可预期的结果,

此时应该用if, else

3. Math.abs() 看起来任何时候都不会为负数,实际上当参数为 -2147483648 时,结果还是-2147483648。 

4.in.skip() 并不是所有时候都会正常跳过。 参数为10*1024或者很大时,就不知道跳哪儿去了。应该在使用这个API时加上返回值判断。

5. 当在写单例模式时,不要在类的一开始就用

public static final MYClass obj = new MYClass();

这样会形成递归,并不会实例化。在使用时也是空指针异常。

应该在类的最后,进行初始化,或者在getxx()中再初始化。

如果一定在要类中初始化,确保这一行要写在其他静态成员初始化之后。

e.g. 

public static final String name = "xx“;

public static final MYClass obj = new MYClass();

6. 

assertEquals 正确时并没有打印。

异常时用以下方式:

try {            

assertEquals(2, number);      

  }

catch(Error e)

{          

 error = e;      

 }

catch(Exception e)

{            

exception = e;      

 } 

7. 不要用URL 来作为map的key , 或者 Set的元素。

URL 虽然字符串看着不同,但是解析成ip:port后,如果相同就会产生和我们预期不一样的效果。

我们要用URL为map的key , 或者 Set的元素。最好使用URI 代替。

8. 当Set定义成Set<Short> xx;

然后向xx中加入short 元素i,再从xx中 remove(i), 其实是没有被remove的,因为加入的是short, remove的是int。

remove(Object)会把short i自动提升成int, 结果就找不到可移除的对象。

解决:我们应该避免使用short这种会自动提升的类型,如果一定要用,用xx.remove((short) i  ), 这样才会是预期的。

 

9. [摘自http://blog.didispace.com/something-about-YYYY-MM-dd/]

YYYYweek-based-year,表示:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年。所以2019年12月31日那天在这种表述方式下就已经 2020 年了。

而当使用yyyy的时候,就还是 2019 年。

10. 在RabbitMQ中,消息的过期时间必须是非负 32 位整数,即:0 <= n <= 2^32-1,以毫秒为单位。 其中,2^32-1 = 4294967295。如果超过这个值就会不生效。故使用时必须要注意各数据类型的边界。翟永超老师遇到过。

http://blog.didispace.com/rabbitmq-deplay-message-max/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值