Java队列错误
我一直收到错误:线程主java.lang.IndexOutOfBoundsException中的异常:索引:2,大小:2。当我按下一个值后弹出并偷看时,它会显示null。当我从一个空队列中弹出/偷看时,它会给我错误信息。这不是将artay list与队列一起使用的正确方法吗Java队列错误,java,list,queue,Java,List,Queue,我一直收到错误:线程主java.lang.IndexOutOfBoundsException中的异常:索引:2,大小:2。当我按下一个值后弹出并偷看时,它会显示null。当我从一个空队列中弹出/偷看时,它会给我错误信息。这不是将artay list与队列一起使用的正确方法吗 public T peek() { if(isEmpty()) throw new RuntimeException("Can't peek here
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;
}
在开始之后,立即将其设置为null。当您将begin设置为null时,还将number设置为null,因为number和begin引用同一个对象
从队列弹出的正确方式如下所示:
参考第一项
从列表中删除项目
返回引用
在代码中,它看起来像这样。对于我的示例,我假设该值是您的ArrayList。也许值是一个比较容易混淆的名称
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是堆栈术语。在第一次Pop/peek之后,队列中有一个元素的值等于null PSB代码摘录:
T number = value.get(begin);
value.set(begin, null);
//value.remove(value.size()-1);
begin++;
在第一次迭代中,begin将等于0。因此,您正在执行类似value.set0、null和begin++的操作,所以现在begin=1
因此,当您下次执行pop/peek时,您实际上尝试获取索引1中不存在的元素,因此您将获得此indexOutOfBoundException。确切地说,您不应该这样递增。在您的情况下,您可能可以检查arraylist的大小,并确保begin计数器在增量后不会超过该大小。