【问题标题】:How to solve an out of bounds exception error?如何解决越界异常错误?
【发布时间】: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


【解决方案1】:

您正在检查 vs.

【讨论】:

  • 感谢您的回复!不幸的是,即使进行了此更改,我仍然会遇到完全相同的错误:(
【解决方案2】:

用下面的代码替换你的代码:

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
    }
  }
}

【讨论】:

  • 不幸的是,我正在使用一个给我的界面,我无法编辑,所以我必须保留其中的所有方法:(谢谢你的回复!
【解决方案3】:

您从收藏中阅读了太多:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-23
    • 2017-04-29
    • 2014-11-19
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多