2011-02-07 2 views
0

Я пытаюсь запустить этот метод, чтобы вставить общее значение (EltType) в двухстороннюю очередь (deque), но я продолжаю получать исключение outOfBoundsException, которое я просто не могу понять. Кто-нибудь может помочь мне с этим? Это всего лишь выдержка из кода, но я думаю, что это может быть связано с этим!Проблема с двунаправленной очередью

private final int CAPACITY = 10; 
    private int capacity; 
    private int end; 
    private EltType deque[]; 

    public ArrayBasedDeque() { 
    this.capacity = CAPACITY; 
    deque = (EltType[]) (new Object[capacity]); 
    } 

    public void insertFirst(EltType first) { 
     if(!isEmpty()) { 
     EltType[] tempArray; 
     tempArray = (EltType[]) new Object[CAPACITY+1]; 
     for (int i=0;i<=deque.length;i++) { 
      tempArray[i+1] = deque[i]; 
     } 
     deque = tempArray; 
     } 
     deque[0] = first; 
     } 

    public boolean isEmpty() { 
    boolean returned; 
    if (deque.length < 1) { 
    returned = true; 
    }else { 
    returned = false; 
    } 
    return returned; 
    } 

Ошибка:

java.lang.ArrayIndexOutOfBoundsException: 10 
    at ArrayBasedDeque.insertFirst(ArrayBasedDeque.java:48) 
    at TestABD.main(TestABD.java:5) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271) 

ответ

2
for (int i=0;i<=deque.length;i++) { 

должен быть изменен в

for (int i=0;i<deque.length;i++) { 

Вы использовали «меньше или равно», но последний элемент массива имеет (длина-1) для индекса.

0

Где вы меняете свой потенциал? Вероятно, это не должно быть константой. Размер также не увеличивается при добавлении.

0
for (int i=0;i<=deque.length;i++) { 

Вы должны использовать <, не <=.

0

B/c вы используете < =, вы идете до deque.length, который равен 10, но deque имеет только 9 индексов.

for (int i=0;i<=deque.length;i++) { 
      tempArray[i+1] = deque[i]; 
} 

< Использование вместо в цикл

3

В дополнение к другим ответы о <=, вы устанавливаете размер массива температуры до МОЩНОСТИ + 1, которая всегда будет 11. Вы, вероятно, имел в виду:

tempArray = (EltType[]) new Object[capacity+1]; 
+0

Кроме того, я бы не рекомендовал иметь имена переменных, которые отличаются только их случаем. Это плохая практика, и вы можете видеть здесь почему. Я бы переименовал вашу константу в INITIAL_CAPACITY. – David

1

Как и другие плакаты уже упоминалось, у вас есть «офф-на-один» ошибка, которая также называется ошибка fencepost.

Кроме того, вы можете упростить метод isEmpty() следующим образом:

public boolean isEmpty() { 
    return end == 0; 
} 

Я предполагаю, что когда end равен нулю, то это означает, что нет никаких элементов в дека. Вы не должны проверять deque.length, потому что это просто говорит вам, сколько элементов может хранить массив, а не сколько из них в данный момент находится в массиве.

0

В качестве примечания:

public boolean isEmpty() { 
    boolean returned; 
    if (deque.length < 1) { 
    returned = true; 
    }else { 
    returned = false; 
    } 
    return returned; 
} 

не делает:

public boolean isEmpty() { 
    deque.length < 1 
} 

взгляд проще?

+0

Вы пропустили ключевое слово 'return';) –

Смежные вопросы