【发布时间】:2012-01-12 17:24:26
【问题描述】:
我昨天发布了一个关于我正在编写的一些代码的问题,并且在使类正确实现接口时遇到了问题。感谢这里用户的大力帮助,已经修复,所以我想我可能会再次获得帮助。
我现在遇到了越界异常错误,尽管我对 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++)
同样的错误仍然出现:(
【问题讨论】:
-
关于编辑:这里显示的代码现在可以工作(请注意,我没有说它是正确的)。如果您仍然收到错误,那么要么您没有执行您认为的代码,要么在您没有向我们展示的某些代码中发生了另一个 IndexOutOfBounds。所以对比一下原来错误和新错误的stacktraces,看看是不是真的是同一个错误。
-
啊,你是对的,在检查错误后,它现在指向 hasNextNote 方法中的“if(Notes.get(k) != null)”,而不是 for 循环。虽然现在我没有看到我的错误!感谢您指出这一点!
-
让我猜猜:
hasNextNote不是来自start(直接或与中间getNextNote)的调用,而是来自另一个地方?在这种情况下,k的值是不可预测的。 -
对不起,我不太明白你的意思? (对不起,我是一个新手,我一定会遇到很烦人的事情!)。当 'start' 被调用时,它会执行 'hasNextNote' 和 'getNextNote'。 'k' 应该只增加直到 'hasNextNote' 返回 false,这意味着没有更多的笔记。
标签: java exception arraylist bounds out