Проблема решена, мне понадобился отдельный счетчик для позиции массива. Спасибо за помощь! Я пишу небольшое приложение, которое берет строку, обрабатывает каждую строку в 7-битный двоичный код и затем заполняет музыкальную шкалу на основе строки. Например, если бы у меня был двоичный код 1000100, то в ключе мажор, который дал бы мне записи 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;
}
Вот код, который используется для получения вхождений 1 в e [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. При использовании "Hello world" в качестве моего ввода (вход преобразуется в 7-битный двоичный файл, прежде чем он обрабатывается одним из этих методов), он проходит через 2-й цикл для каждого цикла, просто отлично в первый раз, но после того, как он пытается заполнить другое место в массиве, оно бросает
java.lang.ArrayIndexOutOfBoundsException: 3
EDIT: Он встречается в notes[i][x] = Integer.toString(x + 1);
метода convertToScale. Я запустил отладчик несколько раз, попробовав предлагаемые ниже изменения, и я все равно получаю ту же ошибку в той же строке. Метод findOccurancesOf возвращает правильное значение (при оценке H (1001000) он возвращает 2.) Так что меня смущает то, что исключение из-за пределов возникает правильно, когда оно заполняет второе место в массиве.
Кроме того, не стесняйтесь говорить мне, если что-то еще сумасшедшее, или мой синтаксис плох. Благодарю!
В findOccurancesOf()
:
if( s.charAt(i) == 1 ) {
должно быть, if( s.charAt(i) == '1' ) {
для проверки символа '1'.
В противном случае он ищет символ с ASCII значением 1.
Существует исключение за пределами, потому что если findOccuranceOf()
возвращает неправильное значение, то notes[i]
не построены с правильной длиной в следующей строке convertToScale()
:
notes[i] = new String[findOccurancesOf(e[i])];
Кроме того, вы, вероятно, хотите использовать что-то вроде:
notes[i][c++] = Integer.toString(x + 1);
с некоторым счетчиком c
инициализированным до 0, если я правильно понимаю ваши намерения.
ArrayIndexOutOfBoundsException
?
Причина 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. Теперь, поскольку вы никогда не выделяли пространство, вы получаете индекс массива из связанного исключения.
Я бы предложил следующее:
notes[i] = new String[e[i].length];
a == '1'
а не a == 1
Исключение вызвано тем, что упомянуто almas, однако обратите внимание, что ваша логическая ошибка, скорее всего, находится внутри метода findOccurencesOf, если идея заключалась в том, чтобы найти все "1" символы внутри строки, вы должны перейти к тому, что я изложил ниже, обратите внимание на апострофы, В противном случае char преобразуется в байтовый код ascii, и если он не совпадает с кодом кода ascii, метод возвращает 0, вызывая ваше исключение
if( s.charAt(i) == '1' ) {