问题解决了,我最终需要一个单独的数组位置计数器。谢谢您的帮助! 我正在编写一个带有字符串的小应用程序,将每个字符串处理成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.)所以让我感到困惑的是,当它填满数组中的第二个点时,出现了越界异常。
另外,请随时告诉我其他内容是否疯狂或语法错误。谢谢!
答案 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.现在既然你没有分配空间,你得到数组索引超出绑定的异常。
我建议如下:
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' ) {