HTC M8 (6.0.1): TreeSet<Long>.contains(Long) 抛出类转换异常:"无法将 Double 转换为 Long"。

3

我们刚刚收到了一份崩溃报告,但我实在不理解它,而且我也不确定这是否是一个好问题……但我无法想出其他的解释。

我有以下代码:

public class LeisureEventSelectedCategories {
    private Set<Long> ids = new TreeSet<>();

    public boolean contains(Long id) {
        if (id == null) {
            return false;
        }
        return ids.contains(id);
    }

当代码行 return ids.contains(id) 抛出以下异常时:

java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long
    at java.lang.Long.compareTo(Long.java)
    at java.util.TreeMap.find(TreeMap.java)
    at java.util.TreeMap.findByObject(TreeMap.java)
    at java.util.TreeMap.containsKey(TreeMap.java)
    at java.util.TreeSet.contains(TreeSet.java)
    at com.acme.b.a.d.a(LeisureEventSelectedCategories.java:50)

我在这里收到的Long是来自于一个Map<String, Long>
leisureEventSelectedCategories.contains(eventCategoryNameToEventId.get(categoryName)) || leisurePlaceSelectedCategories.contains(placeCategoryNameToPlaceId.get(categoryName)),

在哪里

Map<String, Long> placeCategoryNameToPlaceId = new LinkedHashMap<>();
Map<String, Long> eventCategoryNameToEventId = new LinkedHashMap<>();

除了将TreeSet替换为HashSet并在需要的地方使用Collections.sort()之外,还有什么原因导致这种情况发生?在以后应该如何避免? 编辑: 选择来自服务器的所有项目后,leisureEventSelectedCategories中的值图像: LeisureEventSelectedCategories values eventCategoryNameToPlaceId中的值图像: eventCategoryNameToEventId values

不可能用那段代码... 相反,展示一下你是如何调用 contains 方法的。 - ΦXocę 웃 Пepeúpa ツ
我展示了如何调用contains方法...虽然我知道这不应该是可能的,但我确实收到了一个带有此异常的崩溃报告 >.> 我将立即使用LinkedHashSet<Long>替换TreeSet<Long>以进行修复。 - EpicPandaForce
1
顺便说一句,我在三星设备和我的 Nexus 5X 上都无法复现这个崩溃。 - EpicPandaForce
1
哇,这太疯狂了...Double对象可能是从哪里来的?哈哈 - ΦXocę 웃 Пepeúpa ツ
没有啊。> <我也检查了。这是代码。这是数据。我唯一没有的代码是HTC M8上的“TreeSet”代码。不幸的是,我没有拥有该设备,因此无法在该设备上进行调试。 - EpicPandaForce
显示剩余4条评论
1个回答

1
最后,我们只是用LinkedHashSet<Long>替换了它,崩溃就消失了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接