#java #package
Вопрос:
Вот мой код для реализации Queue
. Во время выполнения кода возникает проблема, в методе отображается ошибка во время выполнения peek()
.
public class Queue {
int size;
int frontIndex;
int backIndex;
int arr[];
Queue()
{
size = 5;
frontIndex =-1;
backIndex = -1;
arr = new int[size];
}
public int peek() {
return arr[frontIndex];
}
public void enqueue(int data)
{
if(isFull())
{
System.out.println("Queue is overflow");
}
else
{
System.out.println("Insert " data);
backIndex ;
arr[backIndex]=data;
}
}
public static void main(String[] args) {
Queue queue = new Queue();
queue.enqueue(15);
queue.enqueue(18);
System.out.println("Front element of queue is " queue.peek());
}
}
Это ошибка, которую я получаю:
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 5 "
Комментарии:
1. Вы увеличиваете
backIndex
, когда ставите элемент в очередь, НО вpeek
методе, к которому вы обращаетесьfrontIndex
, значение равно -1, следовательно, исключение за пределами. Вы забыли обновитьfrontIndex
внутриenqueue
метода.2.Вы
frontIndex
начинаете с -1 иpeek
пытаетесь получить доступ к массиву по этому индексу. Так что, вполне ожидаемо. Почему вы этого не ожидаете?3. @Fildor да ,вы правы ,я понял, где совершил ошибку. Спасибо за поддержку.
4. Добро пожаловать в SO. Пожалуйста, сделайте отступ в своем коде. Правильный отступ не является необязательным, но необходим для удобства чтения. Когда вы публикуете на SO, пожалуйста, сделайте так, чтобы людям было как можно проще вам помочь. Спасибо!
Ответ №1:
Вы никогда не обновляете свой frontIndex
.
Что вы могли бы сделать, так это:
Установите frontIndex
значение 0 вместо -1, чтобы это peek()
не создавало исключения до того, как вы получите первый элемент из очереди. Я предполагаю, что причина инициализации его с помощью -1 заключалась в том, что вы увеличивали бы его, прежде чем получать элемент из очереди. Это проблематично, когда вы пытаетесь peek()
войти в очередь перед доступом к ее первому элементу.
Обходной путь состоит в том, чтобы просто инициализировать frontIndex
значение 0, а затем увеличить его после того, как вы получите значение из очереди.
Если peek()
предполагается фактически вывести значение из очереди, простое увеличение frontIndex
в peek
методе:
public int peek() {
frontIndex ;
return arr[frontIndex];
}