【问题标题】:java.lang.ClassCastException; no stacktrace with TreeSet<ItemStack>java.lang.ClassCastException;没有 TreeSet<ItemStack> 的堆栈跟踪
【发布时间】:2017-04-17 15:49:59
【问题描述】:

我已经定义了这个方法:

public static TreeSet<ItemStack> getItems() {
    TreeSet<ItemStack> things = new TreeSet<>();
    things.add(new ItemStack(Material.ACACIA_DOOR));
    return things;
}

我也尝试在 TreeSet 中放置多个东西,它也不起作用。

现在我有了这个代码部分:

TreeSet<ItemStack> things = getItems();

如果我运行它,什么都不会发生。如果我用 try/catch 包围它,似乎会引发异常。 但如果我这样打印错误:

} catch (Exception exc) {
    System.out.println("Catched an exception:")
    exc.printStackTrace();
    System.out.println(exc.getMessage());
    System.out.println(exc);
}

没有任何错误/ Stacktrace 等出现。它只是说:

[INFO]: Catched an exception:
[WARN]: java.lang.ClassCastException
[INFO]: null
[INFO]: java.lang.ClassCastException

那么错误是什么,我该如何防止它以及为什么通过将带有 ItemSets 的 TreeSet 转换为带有 ItemSets 的 TreeSet 来得到它?

【问题讨论】:

  • ItemStack 是否实现了Comparable&lt;ItemStack&gt;?我猜它不会。
  • @AndyTurner 我认为不是:公共类 ItemStack 扩展 Object 实现 Cloneable、ConfigurationSerializable
  • 对,它没有。请注意,extends Object 也是不必要的。
  • 你到底想做什么,@ScrouthTV?
  • 至于为什么没有堆栈跟踪,this question 可能会解释为什么会发生这种情况(但我不确定)。

标签: java plugins minecraft bukkit


【解决方案1】:

您可以做些什么来解决您的情况,从而保证您的预期行为是使用普通列表而不是 TreeSet 来存储您的项目:

ArrayList<ItemStack> items = new ArrayList<ItemStack>();
items.add(new ItemStack(Material.GRASS);
items.add(new ItemStack(Material.DIRT);
//Items is now a list with 2 ItemStacks inside

for (ItemStack is : items) {
    //Do something
}

这样你就解决了你的问题。如果你想对你的 Item 进行特定的命令,应该使用 Treeset,并且 ItemStacks 不能正常订购。

【讨论】:

    【解决方案2】:

    The docs,我认为问题可能在于TreeSet 的项目应该实现Comparable 或扩展“比较器”。希望能帮到你。

    【讨论】:

      【解决方案3】:

      Read the Javadoc.

      即使您不知道自己在寻找什么,也可以点击Ctrl-f,然后在页面中查找ClassCastException。在您正在使用的构造函数的文档中,TreeSet(),您会发现:

      插入集合的所有元素都必须实现Comparable 接口。 ...如果用户尝试向集合中添加违反此约束的元素...,则 add 调用将抛出 ClassCastException

      所以,要么:

      • 让您的ItemStack 实现Comparable&lt;ItemStack&gt;
      • TreeSet 的构造函数提供Comparator&lt;ItemStack&gt;

      【讨论】:

        猜你喜欢
        • 2016-01-28
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2019-10-02
        • 2012-07-11
        相关资源
        最近更新 更多