如何解决越界异常错误?

时间:2011-12-04 18:01:57

标签: java exception arraylist bounds out

我昨天发布了一个问题,关于我正在编写的一些代码,并且无法正确地使用类实现接口。感谢用户在这里得到了很多帮助,并且我认为我可以再次获得帮助。

我现在遇到一个越界异常错误的问题,并且在我的生活中,我看不出问题是什么,虽然我对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++)

同样的错误仍然存​​在:(

3 个答案:

答案 0 :(得分:1)

您正在检查&lt; = size(),而不是&lt; size(),这意味着如果size是2,你将查找索引2(而有效的标记是0和1)。

答案 1 :(得分: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
    }
  }
}

答案 2 :(得分:0)

你从你的收藏中读了太多东西:

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

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