代码之家  ›  专栏  ›  技术社区  ›  Tunaki

将不可比较对象添加到PriorityQueue[已关闭]

  •  -2
  • Tunaki  · 技术社区  · 11 年前

    考虑以下代码:

    import java.util.PriorityQueue;
    
    public class Test {
    
        public static void main(String argv[]) {
            PriorityQueue<A> queue = new PriorityQueue<>();
            System.out.println("Size of queue is " + queue.size()); // prints 0
            try {
                queue.add(new A());
            } catch (ClassCastException ignored) { }
            System.out.println("Size of queue is " + queue.size()); // prints 1
        }
    
    } 
    class A { } // non-comparable object
    

    在此代码中,一个显式不可比较的对象被添加到 PriorityQueue 。根据预期 PriorityQueue.add Javadoc,这段代码抛出 ClassCastException 因为对象是不可比较的。

    然而,尽管引发了异常,队列的大小似乎仍在增加。

    我本来希望两个print语句都输出0,但第二个实际上输出1,就好像一个对象已添加到队列中一样。

    这里发生了什么?

    3 回复  |  直到 11 年前
        1
  •  5
  •   Louis Wasserman    11 年前

    我不希望这一行出现异常。仔细阅读文档:可能会引发异常

    如果指定的元素不能根据优先级队列的顺序与当前在此优先级队列中的元素进行比较

    由于优先级队列中当前没有其他元素,因此我不一定会引发异常。

        2
  •  5
  •   Marko Topolnik    11 年前

    这是文档中的实际陈述:

    依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException ).

    对队列做一些不 被允许 这意味着不保证队列在完成时的行为。作为补充确认,请仔细查看以下部分:“这样做 也许 导致 ClassCastException 换句话说,实现甚至不需要抛出异常。

        3
  •  2
  •   John Bollinger    11 年前

    您声称异常由引发 add() ,但你的测试并不能证明这一说法。如果事实上是一个例外 抛出,那么您应该期望队列的大小保持为0。但是,您不应该期望抛出异常。

    的文档 PriorityQueue.add() 说:

    ClassCastException -如果指定的元素不能根据优先级队列的顺序与当前在此优先级队列中的元素进行比较

    如果没有其他元素,则不会出现这种情况。但是,如果您尝试添加另一个元素,则应引发异常,队列大小应保持为1。

    推荐文章