Java.lang.ArrayIndexOutOfBoundsException: 4

Я работаю над извлечением значений из текстового файла, разделенного табуляцией, в список в Groovy. Но натыкаюсь на ArrayIndexOutOfBoundsException.

Код

println("Reading File Contents")

def fullArray = new String[31721][4]
def availableArray = new String[1386][2]
def filteredFullArray = new String[1386][5]

String fileContents = new File('beliefs.txt').text
String availableContents = new File('available.txt').text

def count = 0

fileContents.eachLine { line ->

    String[] str
    str = line.split('\t')

    def subCount = 0
    for (subCount; subCount < str.length; subCount++) {
         fullArray[count][subCount] = str[subCount]
    }
    count++
}

trusts.txt

1   Azerbaijan  hasOfficialLanguage Azerbaijani_language
2   Augustus    hasChild    Julia_the_Elder
3   Arthur_Aikin    isCitizenOf England
4   Arthur_Aikin    diedIn  London
5   Alexander_III_of_Russia isMarriedTo Maria_Feodorovna__Dagmar_of_Denmark_
6   Alexander_III_of_Russia hasChild    Nicholas_II_of_Russia
7   Alexander_III_of_Russia hasChild    Grand_Duke_Michael_Alexandrovich_of_Russia
8   Alexander_III_of_Russia hasChild    Grand_Duchess_Olga_Alexandrovna_of_Russia
9   Alexander_III_of_Russia hasChild    Grand_Duke_Alexander_Alexandrovich_of_Russia
10  Alexander_III_of_Russia hasChild    Grand_Duke_George_Alexandrovich_of_Russia
...
...
...
31719   Minqi_Li    isKnownFor  Chinese_New_Left
31720   Henry_Bates_Grubb   isKnownFor  Mount_Hope_Estate
31721   Thomas_Kuhn isKnownFor  Paradigm_shift  

Запуск этого дает мне следующую ошибку.

Caught: java.lang.ArrayIndexOutOfBoundsException: 4 java.lang.ArrayIndexOutOfBoundsException: 4 at extractBeliefs$_run_closure1.doCall(extractBeliefs.groovy:19) at extractBeliefs.run(extractBeliefs.groovy:12)

Мне известна причина, по которой может возникнуть указанная выше ошибка. Но поскольку мой массив не превышает последний индекс, и поскольку показано, что ошибка находится в строке fileContents.eachLine { line ->, я не могу найти, где это происходит не так.

Мы будем очень благодарны за любые предложения по этому поводу.

У вас есть дополнительная вкладка в одной строке.

Dawood ibn Kareem 06.12.2018 07:19

Один из способов найти строку с дополнительной вкладкой - это импортировать файл в Excel с разделением табуляцией, а затем быстро просмотреть столбец E, чтобы увидеть, где находится текст.

Dawood ibn Kareem 07.12.2018 21:48

Спасибо. Но проблема в том, что в нем примерно 23000 строк, и, следовательно, я работаю над методом автоматического объединения любого текста, который в настоящее время разделен табуляцией и намеренно не предназначен.

Nayantara Jeyaraj 10.12.2018 04:31

Вы можете просто увеличить второе измерение fullArray, чтобы оно было достаточно большим, чтобы хранить сколько угодно полей в строке, в которой их больше всего. Или вы можете изменить условие в цикле for на subCount < str.length && subCount < 4.

Dawood ibn Kareem 10.12.2018 04:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
909
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте разделить пробелом

str = line.split('\s+')

вместо

str = line.split('\t')

Похоже, что '\s+' недействителен в Groovy, так как выдает ошибку. Обновлено: если вы хотели разделить на основе нескольких пробелов, что кажется логичным, я попытался использовать '\\s+', который тоже не сработал.

Nayantara Jeyaraj 06.12.2018 07:32

Лучшим способом было бы сначала заменить все Multispaces или вкладки одним пробелом, а затем разделить на один пробел.

line = line.replace("\\s+/g", " ")
str = line.split('\\s+')

Спасибо за ответ. Но что такое g в /\s\s+/g? Вроде выдает ошибку. Также я поменял ('\s+') на ('\\s+')

Nayantara Jeyaraj 06.12.2018 07:39

@Nayantara Jeyaraj the / g, он заменяет все символы пробела (пробел, табуляция, \ r, \ n, \ v \ f) пробелом. глобальный поиск шаблона

Yugansh 06.12.2018 09:54

Вышеуказанное не сработало. Но, по словам @Dawood, похоже, что есть несколько пробелов для табуляции, и, следовательно, я их изменяю. Кажется проще

Nayantara Jeyaraj 06.12.2018 11:15
Ответ принят как подходящий

Ваша первоначальная ошибка исходит из этой строки (19):

fullArray[count][subCount] = str[subCount]

Строка 12 просто поднимает исключение на выходе из закрытия. Это определенно указывает на то, что у вас есть дополнительная вкладка в одной строке ... для целей отладки попробуйте вывести строку на консоль, прежде чем пытаться загрузить ее в массив. Это поможет вам определить, в какой строке есть ошибка.

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