0

我昨天发布了一个关于我正在编写的一些代码的问题,并且无法使类正确实现接口。感谢这里已经修复的用户的大力帮助,所以我想我可能会再次获得帮助。

我现在遇到了越界异常错误,尽管我对 java 很陌生,但我终其一生都看不到问题出在哪里。

该应用程序显示允许用户单击它们的钢琴键,并保存它们被单击的顺序和特定声音的音符的 midicode。然后,当用户单击播放时,它会按照保存音符的顺序调用曲调。我正在使用数组列表来存储笔记,然后想在用户单击播放时调用它们,这会调用“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

对此的任何帮助都会很棒,在此先感谢您:)

我也会尽力提供所需的任何额外信息:)

编辑:将 for 循环更改为

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

并且仍然发生相同的错误:(

4

3 回答 3

1

您正在检查 vs. <= size(),而不是 < size(),这意味着如果 size 为 2,您将查找索引 2(而有效的索引是 0 和 1)。

于 2011-12-04T18:04:27.890 回答
1

用以下代码替换您的代码:

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
    }
  }
}
于 2011-12-04T18:11:16.377 回答
0

你从你的收藏中读了太多的一个项目:

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

比较应该改为阅读k < Notes.size();。该集合是 0 索引的,因此最后一个条目具有 indexsize-1而不是size

于 2011-12-04T18:05:16.480 回答