多平台统一管理软件接口,如何实现多平台统一管理软件接口
365
2022-10-03
浅谈Java包装类型Long的==操作引发的低级bug
目录背景两个 Long 类型的 ==对 Collections.EMPTY_SET 进行 add 引发的异常Collections 的空集合使用注意事项启示录
背http://景
一个简单的列表检索功能,列表元素有一个 Long 类型的属性,遍历过程中犯了一个低级错误,导致功能流程始终错误,本文将分享两个低级错误引发的 bug。
两个 Long 类型的 ==
查找某个元素 A 在列表 B 中对应的对象的时候,根据元素主键查询,主键类型为包装类型 Long ,遍历流程如下:
for(MyData temp:b){
if (temp.getId() == a.getId() { // MyData 的 id 属性为 Long 类型
return temp;
}
}
这么一段简单的查找代码,结果怎么都找不到目标对象,断点调试发现问题出在 == 操作上,改成 equals 就可以了。
关于 java Long 的包装类型和元素类型的判断相等的操作回顾:
Long a = 81487354807713792L;
Long b = 81487354807713792L;
System.out.println(a==b); // false
System.out.println(a.equals(b)); // true
long c = 81487354807713792L;
long d = 81487354807713792L;
System.out.println(c==d); // true
对 Collections.EMPTY_SET 进行 add 引发的异常
另一个低级错误是对 Collections.EMPTY_SET 进行 add 引发的,需要合并两个集合,第一个集合 A 可能是
Collections.EMPTY_SET ,最终将另一个集合 B 合并到 A 得到一个大集合。
Set
Set
a.addAll(b);
当集合 a 为集合的空对象时,操作异常:
Exception in thread "main" java.lang.UnsupportedOperationException
at javavxFBu.util.AbstractCollection.add(AbstractCollection.java:262)
修正方式:如果需要直接对一个集合进行 add ,就不能用 Collections.EMPTY_SET。
Collections 的空集合使用注意事项
以 Collections.EMPTY_SET 为例,跟源码它的定义主要是下面三行代码:
public static final Set EMPTY_SET = new EmptySet<>();
private static class EmptySet
AbstractSet
核心在于 AbstractCollection 类的 add,默认直接抛出了异常,限制了空集合不允许添加:
public boolean add(E e) {
throw new UnsupportedOperationException();
}
结论:java.util.Collections 类中所有的 EMPTY_XXX 对象都不能进行 add 操作。
启示录
定位到这两个低级错误后,想起那句调侃:代码编写分分钟,bug 查找两小时。这两个问题恰好是一个比较复杂的流程的一部分,构建环境进行测试,测一http://次差不多十几分钟,加上机器怠工,跟这俩小问题,耗http://了两个小时。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~