Java队列错误

时间:2014-03-05 18:30:00

标签: java list queue

我不断收到错误:线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:2,大小:2。当我将一个值推入其中后弹出并查看时显示为null。当我从空队列弹出/偷看时,它给了我错误。这不是将artay列表与队列一起使用的正确方法吗?

 public T peek()
        {
            if(isEmpty())
                throw new RuntimeException("Can't peek here");

            return value.get(value.size()-1););
        }

public T pop()
    {
        if(isEmpty())
            throw new RuntimeException("Can't pop here");

        T number = value.get(begin);
        value.set(begin, null);
        //value.remove(value.size()-1);

        begin++;
        return number;
    }

2 个答案:

答案 0 :(得分:0)

在获得begin之后,立即将其设置为null。将begin设置为null时,还将number设置为null,因为number和begin引用相同的对象。

从队列中“弹出”的正确方法如下:

  • 参考第一项
  • 从列表中删除项目
  • 返回参考

在代码中,它看起来像这样。对于我的例子,我假设value是你的ArrayList。也许values可能不那么令人困惑。

T number = value.get(0); // Reference the first item
value.remove(0) // Remove it from the list
return number; // Return the reference

在执行任何这些操作之前,您应检查列表是否为空。

if(val.size() > 0) {
    // Do Stuff
} else {
    throw CannotPopFromAnEmptyQueueException();
}

值得一提的是,在谈论一个队列时,“pop”并不是一个好词。 入队出队是更正式的条款。 Pop push 是堆栈术语。

答案 1 :(得分:0)

在第一次pop / peek之后,队列中将有一个元素,其值等于“null”

PSB摘自您的代码:

T number = value.get(begin);
value.set(begin, null);
//value.remove(value.size()-1);

begin++;

在第一次迭代中,begin将等于0.所以,你正在做类似value.set(0,null)和开始++的事情,所以现在开始= 1。

因此,当你下次去pop / peek时,你实际上是尝试在索引1处获取不存在的元素,因此你得到这个indexOutOfBoundException。