Java中2D Ragged数组的超出界限异常

时间:2014-11-23 08:53:52

标签: java arrays

问题解决了,我最终需要一个单独的数组位置计数器。谢谢您的帮助! 我正在编写一个带有字符串的小应用程序,将每个字符串处理成7位二进制代码,然后根据字符串填充音阶。例如,如果我有二进制1000100,在C Major的键中会给出音符C和G(C 0 0 0 G 0 0)。

我遇到了一个特定代码片段的问题,该代码片段接受String []的输入(其中每个元素是一个值为二进制的单个字符,7位)并处理字符串中的每个单独字符它们自己并存储字符串中出现1的索引号。例如,字符串1000100将输出1和5.

以下是执行此操作的方法:

public static String[][] convertToScale(String[] e){
    String[][] notes = new String[e.length][]; //create array to hold arrays of Strings that represent notes
    for(int i = 0; i < e.length; i++){
        notes[i] = new String[findOccurancesOf(e[i])]; //create arrays to hold array of strings
        for(int x = 0; x < e[i].length(); x++){ 
            if((e[i].charAt(x)) != 48){ //checks to see if the char being evaluated is 0(Ascii code 48)
                notes[i][x] = Integer.toString(x + 1); // if the value isn't 0, it fills in the array for that position.the value at x+1 represents the position of the scale the note is at
            }
        }
    }
    return notes;
}

以下是用于在e [1]中出现1的代码:

public static int findOccurancesOf(String s){
    int counter = 0;
    for(int i = 0; i < s.length(); i++ ) {
        if( s.charAt(i) == 1 ) {
            counter++;
        } 
    }
    return counter;
}

我遇到的问题是使用convertToScale方法。当使用&#34; Hello world&#34;作为我的输入(输入在被这些方法中的任何一个处理之前被转换为7位二进制)它第一次通过第二个for-each循环,但在它尝试填充数组中的另一个点之后,它抛出

  

java.lang.ArrayIndexOutOfBoundsException:3

编辑:它出现在convertToScale方法的行notes[i][x] = Integer.toString(x + 1);中。在尝试下面的建议更改后,我已经多次运行调试器,但我仍然在同一行中得到相同的错误。 findOccurancesOf方法返回正确的值(当评估H(1001000)时它返回2.)所以让我感到困惑的是,当它填满数组中的第二个点时,出现了越界异常。

另外,请随时告诉我其他内容是否疯狂或语法错误。谢谢!

3 个答案:

答案 0 :(得分:1)

findOccurancesOf()

if( s.charAt(i) == 1 ) {if( s.charAt(i) == '1' ) {来检查字符&#39; 1&#39;。

否则,它正在寻找ASCII值为1的字符。

存在一个超出范围的异常,因为如果findOccuranceOf()返回错误的值,则notes[i]的{​​{1}}的{​​{1}}未构造为正确的长度:

convertToScale()

此外,您可能希望使用以下内容:

notes[i] = new String[findOccurancesOf(e[i])];
如果我理解你的意图,

将一些计数器notes[i][c++] = Integer.toString(x + 1); 初始化为0。

答案 1 :(得分:0)

AIOOBE的原因在于这一行:

notes[i] = new String[findOccurancesOf(e[i])]; //create arrays to hold array of strings

你调用findOccurancesOf方法在你的String中找到1的出现你说你找不到的Hello然后返回0然后用x调用notes[i][x] = Integer.toString(x + 1);为0.现在既然你没有分配空间,你得到数组索引超出绑定的异常。

我建议如下:

  • 在指定索引大于0或其他内容之前验证您的字符串。
  • 将您的笔记[i]初始化为notes[i] = new String[e[i].length];
  • 使用a == '1'而不是a == 1
  • 等单引号检查字符

答案 2 :(得分:0)

异常是由 almas 提到的,但请注意,您的逻辑错误很可能是在 findOccurencesOf 方法中,如果想要查找所有 >&#39; 1&#39; 字符串中的字符必须更改为我在下面列出的内容,请注意使用的字符。否则,char将转换为字节ascii代码,除非与ascii代码1的代码匹配,否则该方法将返回0,从而导致异常

 if( s.charAt(i) == '1' ) {