我昨天发布了一个问题,关于我正在编写的一些代码,并且无法正确地使用类实现接口。感谢用户在这里得到了很多帮助,并且我认为我可以再次获得帮助。
我现在遇到一个越界异常错误的问题,并且在我的生活中,我看不出问题是什么,虽然我对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++)
同样的错误仍然存在:(
答案 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
。