Исключение вне границ для двумерного рваного массива в Java

1

Проблема решена, мне понадобился отдельный счетчик для позиции массива. Спасибо за помощь! Я пишу небольшое приложение, которое берет строку, обрабатывает каждую строку в 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.) Так что меня смущает то, что исключение из-за пределов возникает правильно, когда оно заполняет второе место в массиве.

Кроме того, не стесняйтесь говорить мне, если что-то еще сумасшедшее, или мой синтаксис плох. Благодарю!

  • 0
    Отладьте свой код, и вы найдете проблему менее чем за 20 секунд.
  • 0
    Укажите, на какую строчку было выдано это исключение.
Показать ещё 1 комментарий
Теги:
arrays

3 ответа

1
Лучший ответ

В 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, если я правильно понимаю ваши намерения.

  • 0
    Как это объясняет ArrayIndexOutOfBoundsException ?
  • 0
    @alfasin Обновил ответ.
Показать ещё 5 комментариев
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] = new String[e[i].length];
  • Проверка символа с одинарными кавычками вроде a == '1' а не a == 1
  • 0
    Я думаю, что, возможно, объяснил проблему плохо. К тому времени, когда ввод (строка) попадает в эти методы, он превращается в строку [], где каждый элемент представляет собой 7-разрядное двоичное преобразование каждого символа в исходной строке. Кроме того, при добавлении второго массива в notes [i] я хочу, чтобы во втором массиве было только столько элементов, сколько единиц в двоичном входе. Вот почему я нахожу количество вхождений 1 в каждой строке двоичного файла и инициализирую второй массив этим значением. Спасибо! :)
0

Исключение вызвано тем, что упомянуто almas, однако обратите внимание, что ваша логическая ошибка, скорее всего, находится внутри метода findOccurencesOf, если идея заключалась в том, чтобы найти все "1" символы внутри строки, вы должны перейти к тому, что я изложил ниже, обратите внимание на апострофы, В противном случае char преобразуется в байтовый код ascii, и если он не совпадает с кодом кода ascii, метод возвращает 0, вызывая ваше исключение

 if( s.charAt(i) == '1' ) {
  • 0
    Я обновил вопрос после того, как попробовал ваши предложения! Спасибо :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню