Как решить ошибку исключения вне границ? - PullRequest
0 голосов
/ 04 декабря 2011

Я вчера отправил вопрос о каком-то коде, который писал, и у меня были проблемы с тем, чтобы класс правильно реализовал интерфейс. Благодаря большой помощи пользователей здесь, это было исправлено, и поэтому я подумал, что смогу снова получить помощь.

У меня сейчас проблема с ошибкой вне пределов и, насколько я понимаю, в чем проблема, хотя я совершенно новичок в Java.

Приложение отображает клавиши пианино, которые позволяют пользователю нажимать на них, и сохраняет порядок, в котором они были нажаты, и мидикод нот для определенного звука. Затем, когда пользователь нажимает кнопку воспроизведения, он вызывает мелодию в порядке сохранения заметок. Я использую список массивов для хранения заметок, а затем хочу вызвать их, когда пользователь нажимает кнопку воспроизведения, которая вызывает метод «start», а затем повторно вызывает метод «getNextNote», пока не останется больше заметок. Однако всякий раз, когда я нажимаю кнопку воспроизведения, я получаю ошибку исключения вне пределов. Ниже приведен мой код:

import java.util.*;
import mvcchords.*;

public class MyNoteStore implements NoteStore {

public ArrayList<Integer> Notes = new ArrayList<Integer>();
int k;

public void noteAdded(int midicode) {
    Notes.add(midicode);
}

public boolean hasNextNote() {
    if(Notes.get(k) != null)
        return true;
    else
        return false;
}

public int getNextNote() {

        if(hasNextNote() == true)
            return Notes.get(k);
        else
            return 0;
    }

public void start(int sortOrder) {

    for(k = 0; k < Notes.size(); k++){
    hasNextNote();
    getNextNote();
    }
  }
}

Ниже приведена ошибка, которую я получаю, когда пытаюсь нажать кнопку воспроизведения с 3 сохраненными нотами (хотя ошибка одна и та же, независимо от того, сколько нот я сохранил, только числа в конце равны количеству выбранных нот) ):

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3

Любая помощь с этим была бы отличной, заранее спасибо :)

Я также приложу все усилия, чтобы предоставить любую необходимую дополнительную информацию:)

EDIT: изменен цикл for на

 for(k = 0; k < Notes.size(); k++)

И та же ошибка все еще происходит: (

Ответы [ 3 ]

1 голос
/ 04 декабря 2011

Замените ваш код с кодом ниже:

public class MyNoteStore implements NoteStore {

private List<Integer> notes = new ArrayList<Integer>();

public void noteAdded(int midicode) {
    notes.add(midicode);
}

public boolean hasNextNote() {
   // do you need this method?
}

public int getNextNote() {
   // do you need this method?
}
public void start(int sortOrder) {
    for(Integer note : notes){
       // "note" var contains each note from notes
    }
  }
}
1 голос
/ 04 декабря 2011

Вы сравниваете с <= size (), а не с <size (), что означает, что если size равен 2, вы будете искать индекс 2 (в то время как действительные значения равны 0 и 1). </p>

0 голосов
/ 04 декабря 2011

Вы слишком много читаете из своей коллекции:

for(k = 0; k <= Notes.size(); k++) ...

Сравнение должно показывать k < Notes.size(); вместо этого. Коллекция имеет индекс 0, поэтому последняя запись имеет индекс size-1, а не size.

...