Java中2D不规则数组的越界异常

Java中2D不规则数组的越界异常,java,arrays,Java,Arrays,问题解决了,我最后需要一个单独的计数器阵列位置。谢谢你的帮助! 我正在编写一个小应用程序,它接受一个字符串,将每个字符串处理成7位二进制代码,然后根据该字符串填充一个音阶。例如,如果我有二进制1000100,在C大调的键中,它会给我音符C和G(C00G00) 我对一段特定的代码有一个问题,它接受字符串[]的输入(其中每个元素都是一个值为7位的二进制字符),并处理字符串中的每个字符本身,并存储字符串中出现1的位置的索引号。例如,字符串1000100将输出1和5 以下是实现此目的的方法: publi

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

我对一段特定的代码有一个问题,它接受字符串[]的输入(其中每个元素都是一个值为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;
}
publicstaticstring[]convertToScale(String[]e){
String[][]notes=新字符串[e.length][];//创建数组以保存表示注释的字符串数组
for(int i=0;i
下面是用于获取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;
}
public static int findOccurancesOf(字符串s){
int计数器=0;
对于(int i=0;i
我遇到的问题是convertToScale方法。当使用“Hello world”作为我的输入时(输入在通过这两种方法处理之前被转换为7位二进制),它会在第一次循环中通过第二个循环,但在尝试填充数组中的另一个位置后,它会抛出

java.lang.ArrayIndexOutOfBoundsException:3

编辑:出现在
notes[i][x]=Integer.toString(x+1)行中。在尝试了下面的修改之后,我已经多次运行了调试器,但在同一行中仍然出现相同的错误。findOccurancesOf方法返回正确的值(当计算H(1001000)时,它返回2。)因此让我困惑的是,越界异常正好出现在数组中的第二个位置

另外,如果还有什么事情是疯狂的或者我的语法不好,请随时告诉我。谢谢

findOccurancesOf()
中:

if(s.charAt(i)==1){
应该是
if(s.charAt(i)='1'){
来检查字符“1”

否则,它将查找ASCII值为1的字符

存在一个越界异常,因为如果
findOccuranceOf()
返回错误的值,则
notes[i]
convertToScale()
的下一行中没有使用正确的长度构造:

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

notes[i][c++] = Integer.toString(x + 1);

如果我正确理解您的意图,则某些计数器
c
初始化为0。

AIOOBE的原因如下:

notes[i] = new String[findOccurancesOf(e[i])]; //create arrays to hold array of strings
调用
findOccurancesOf
方法来查找字符串中出现的1,对找不到的内容打个招呼并返回0,然后调用
notes[i][x]=Integer.toString(x+1);
并将x设为0。现在,由于从未分配空间,因此可以获得数组索引越界异常

我建议如下:

  • 在将索引指定为大于0或其他值之前验证字符串
  • 将注释[i]初始化为
    notes[i]=新字符串[e[i].length];
  • 检查带有单引号的字符,如
    a==“1”
    而不是
    a==1

异常是由almas提到的引起的,但是请注意,您的逻辑错误很可能在findOccurencesOf方法中,如果要查找字符串中的所有“1”字符,您必须更改为我在下面概述的内容,请注意撇号。否则,字符将转换为字节ascii码,除非与代码为ascii代码1,该方法将返回0,导致您的异常

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

调试您的代码,您将在不到20秒的时间内发现问题。请指出引发此异常的行。调试是我尝试的第一件事,也是最让我困惑的事情!我用出现错误的行更新了问题。谢谢:)它如何解释
ArrayIndexOutOfBoundsException
?@alfas在中更新了答案。即使它的构造长度不正确,迭代也会在
x
-这不应该导致
ArrayIndexOutOfBoundsException
@alfan如果停止条件是
x
,但不是那样。我在尝试了你的建议后更新了问题!谢谢:)我在尝试了你的建议后更新了问题!谢谢:)我想我可能解释得不好。当输入(字符串)到达这些方法时,它已变成字符串[]每个元素都是原始字符串中每个字符的7位二进制转换。另外,将第二个数组添加到notes[i]中时,我希望第二个数组的元素数量与二进制输入中的元素数量相同。这就是为什么我在每个二进制字符串中找到1的出现次数,并将第二个数组初始化为该值。谢谢!)
 if( s.charAt(i) == '1' ) {