Почему этот код продолжает возвращать «java.lang.StringIndexOutOfBoundsException: индекс 48 выходит за пределы для длины 48»?

Этот метод должен был отделять массив playlist1d через каждый символ '|'. а затем отправить их в 2d-массив «playlist2d», но он каждый раз возвращает одну и ту же ошибку.

    public String[][] charCounterRow(int songCount, String[] playlist1d)throws IOException{
        Character temp;
        int characterCount=0, col = 0, rowLength, nullCount=0;
        String playlist2d[][] = new String[lineCount][6];
        String tempLine = "|", tempString;
        for(int counter = 0; counter < lineCount; counter++){
            temp = playlist1d[counter].charAt(characterCount);
            tempString = String.valueOf(temp);
            rowLength = playlist1d[counter].length();
            while(characterCount < rowLength && col <= 5){
                if (tempString.equals(tempLine)){
                    characterCount++;
                    col++;
                    nullCount = 0;
                    temp = playlist1d[counter].charAt(characterCount);
                    tempString = String.valueOf(temp);
                }
                else if (!tempString.equals(tempLine)){
                    if (nullCount == 0){
                        playlist2d[counter][col] = String.valueOf(temp);
                    }
                    else{
                        playlist2d[counter][col] += temp;
                    }
                    characterCount++;
                    temp = playlist1d[counter].charAt(characterCount);
                    tempString = String.valueOf(temp);
                    nullCount++;
                }
            }
            characterCount = 0;
            col=0;
        }
        return playlist2d;
    }

Проблема продолжает возникать в строке «temp = playlist1d[counter].charAt(characterCount);» под первым оператором «если». Я попытался исправить это, добавив 'col<=5' в цикл while, но по какой-то причине блок кода внутри него продолжает работать, даже если col превышает 5.

Вот текст в массиве:

Это должно быть в плейлисте 1d

 private static String[] playlist1d = new String[] {
            "List | Title | Artist | Album | Genre | Rating | ",
            "1 | qwer | asd | zxcv | asdf | 2 | ",
            "2 | wert | sdfg | xcvb | sfdg | 3 | ",
            "3 | erty | dfgh | cvbn | dfgh | 1 | ",
            "4 | qwer | asdf | zxcv | sedfg | 5 | ",
            "5 | wert | sdf | asdf | qwer | 4 | ",
            "6 | poij | wert | asdf | bsfs | 4 | ",
            "7 | test | fdsf | gfddg | oij | 4 | ",
            "8 | tret | gfgd | sdfd | we | 1 | ",
            "9 | t | s | d | f | 4 | ",
            "10 | poij | wert | sdfgshdg | a | 2 | ",
            "11 | qer | asdaf | tsth | sf | ",
            "12 | qwer | asdf | zxcv | asfd | 2 |"
    };

lineCount и songCount будут просто количеством строк в массиве или в данном случае 13.

Я ожидал, что код в цикле while просто остановится после того, как переменная «col» превысит 5, но по какой-то причине она дошла до 6, после чего появилась ошибка. Я также попробовал сделать col < 5 в цикле while, и это сработало и ограничило col до 4, но это просто не сработало для col < 6 или col <= 5.

Можете ли вы предоставить примеры значений для int songCount, String[] playlist1d и int lineCount?

tresf 11.06.2024 04:21

Длина 48 означает, что индексы идут от 0 до 47. 48 выходит за пределы...

Déjà vu 11.06.2024 04:23

Я понимаю, что 48 за пределами допустимого, но я не совсем понимаю, как оно вообще достигает 48. В цикле while длина строки равна 48, поэтому я думал, что она просто остановится на 47 или достигнет 5 столбцов.

Michael 11.06.2024 04:32

@Michael Как вы рассчитываете lineCount (думаю, вы частично ответили на этот вопрос, но ваш ответ, похоже, был удален).

tresf 11.06.2024 04:37

О, я понимаю, судя по всему, что это вероятно playlist1d.length.

tresf 11.06.2024 04:38

@tresf Я просто помещаю lineCount в качестве глобальной переменной и редактирую ее по всему коду, пока меняю количество строк в массиве.

Michael 11.06.2024 04:40

Вы увеличиваете и используете новое значение до того, как будет возвращена проверка границ, поэтому таким образом вы, по сути, неизбежно превысите свои границы.

Rogue 11.06.2024 04:50

К вашему сведению, еще одна потенциальная ошибка: для трека 11 не указан рейтинг.

tresf 11.06.2024 05:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь получить доступ к персонажу по адресу rowLength. Вы убедитесь, что characterCount меньше rowLength, но затем увеличиваете characterCount++ непосредственно перед использованием.

Одно из решений — прекратить цикл на rowLength -1, чтобы characterCount никогда не превышало размер вашего массива.

До:

rowLength = playlist1d[counter].length();

После:

rowLength = playlist1d[counter].length() - 1;

Таким образом, оператор temp = playlist1d[counter].charAt(characterCount); не пытается получить доступ к элементу, размер которого превышает его собственный размер (классическая проблема «индекс начинается с нуля»).

Другое решение — переместить приращение до тех пор, пока вы не используете индекс, но это может повлиять на другую логику.

Не имеет отношения к делу, но в такие моменты я использую String.split(), чтобы не отслеживать каждого персонажа. Оно может потребовать большей вычислительной мощности, чем ваше решение, но зачастую его легче читать и отлаживать.

Огромное спасибо чувак, наконец-то работает. Этот индексный материал всегда так раздражает, и я всегда с ним путаюсь, поскольку он начинается с 0. Честно говоря, мне бы хотелось использовать эту функцию String.split(), поскольку она кажется довольно полезной для такого рода приложений, но, к сожалению, мои ограничения просто к понятиям, которые я изучил в этом классе, так что :/

Michael 11.06.2024 04:52

Отлично, если вы нашли ответ на решение своей проблемы, вы можете пометить ее как решенную.

tresf 11.06.2024 04:55

Ух, как именно вы решаете пост?

Michael 11.06.2024 05:07

@Майкл, обычно под стрелками вверх и вниз есть флажок, чтобы пометить проблему как решенную. Вы также можете, если хотите, проголосовать за любые вопросы или ответы, которые вы найдете полезными на веб-сайте.

tresf 11.06.2024 05:13

Хорошо, спасибо, я нажал галочку и проголосовал бы за, но, к сожалению, сначала мне нужно 15 репутации. Хотя это определенно было полезно!

Michael 11.06.2024 05:20

Другие вопросы по теме