Member 14500267 Ответов: 3

Исключение в потоке "main" java.lang.arrayindexoutofboundsexception: 2


как мне решить эту проблему, Ребята, дайте несколько решений.

Что я уже пробовал:

пакет com.записанных;
импорт java.io-да.*;

тест открытый класс {

публичный статический пустота главный(строка [] аргументы){

// Имя файла, который нужно открыть.
String fileName = "/home/imtadmin/Desktop/task";

// Это будет ссылаться на одну строку за раз
Строки = значение null;

пробовать {
// FileReader считывает текстовые файлы в кодировке по умолчанию.
FileReader fileReader =
новый FileReader(имя файла);

// Всегда оборачивайте FileReader в BufferedReader.
Командой bufferedreader командой bufferedreader =
новый BufferedReader(fileReader);
в то время как((строка = командой bufferedreader.с readline()) != нуль) {
Строка[] разбиты = линия.сплит("~");

Строку первый=расщепляется[0];
Строки второй=расщепляется[1];
Строка третья=расщепленная[2];

System.out.println(fisrt+"="+secod+"="+третий);
}
// Всегда закрывайте файлы.
командой bufferedreader.рядом();
}
поймать(исключение filenotfoundexception экс) {
Системы.из.код println(
"Невозможно открыть файл" +
имя файла + "'");
}
catch(IOException ex) {
Системы.из.код println(
"Ошибка чтения файла '"
+ имя файла + "'");
// Или мы могли бы просто сделать это:
// ex.printStackTrace();
}
}
}

выход:-
7892425242=Рамадас12344=Рама
9789949018=Тест1=Тест2
ABC Company Ltd=Test1=Test2
Азбука Индия ПВТ. Лтд.=Условие_1=Test2 На
Abhilash Loan A/c=Test1=Test2
Abxd India Pvt Ltd=Test1=Test2
Аккум. Dep. on кондиционер=Test1=Test2
Аккум. Отд. на дом=Тест1=test2 на
Аккум. Dep. on Computer & Per.=Test1=Test2
Аккум. Отд. на Ферн. &ампер; победить в онлайне.=Условие_1=Test2 На
Аккум. Деп. на автомобиле==Тест2
Аккум. Dep. on P & M - I=Test1=Test2
Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 2
в com.imatrix.Test.main(Test.java:29

3 Ответов

Рейтинг:
2

OriginalGriff

Мы не можем сказать - потому что у нас нет доступа к вашему файлу данных, и это будет иметь решающее значение для выяснения, почему это проблема. Но это довольно просто по сути: по крайней мере одна из строк в вашем файле не содержит по крайней мере двух символов'~', поэтому массив, возвращаемый split функция не содержит трех элементов.

Проблема в том, что мы не можем посмотреть на файл teh, и мы не можем сказать, какие строки дают проблему.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей компиляторной системы, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
0

Richard MacCutchan

Сообщение об ошибке сообщает вам, что значение индекса 2 является недопустимым, а код-нарушителем является:

String[] splitted = line.split("~");

String fisrt=splitted[0];
String secod=splitted[1];
String third=splitted[2]; 

Вы совершаете одну из самых распространенных ошибок, которые мы видим здесь. Откуда вы знаете, что это послание состоит из трех частей? А что если их нет ~ символы вообще во входных данных? Вы должны проверить количество возвращаемых деталей, прежде чем пытаться получить к ним доступ.
if (splitted.length < 3)
{
    // less than three parts in the data
}


И смотрите, вот оскорбительная линия:
Accum. Dep. on P & M - II~Test1~


Member 14500267

можете ли вы отправить кодировку для устранения ошибки

Richard MacCutchan

Я показал вам кодировку выше. Проверьте длину массива и сделайте все необходимое с данными. Я понятия не имею, что вы пытаетесь сделать с результатами.

Member 14500267

Я ПЫТАЮСЬ ОЧИСТИТЬ ОШИБКУ ВРЕМЕНИ ВЫПОЛНЕНИЯ
И МНЕ НУЖНО СОХРАНИТЬ ЗНАЧЕНИЯ В HASHMAP И ИЗ ЭТОГО МНЕ НУЖНО РАСПЕЧАТАТЬ ЗНАЧЕНИЯ И ПОКАЗАТЬ ИХ В КАЧЕСТВЕ ВЫХОДНЫХ ДАННЫХ

Richard MacCutchan

Я сказал тебе, что ты должен сделать. Проверьте длину массива и выполните следующие действия нет попробуйте получить доступ к элементам, которые не существуют.

И, пожалуйста, перестань кричать. Печатать во всех столицах считается грубостью.

Member 14500267

извинись за это...

Member 14500267

Я ПЫТАЮСЬ ОЧИСТИТЬ ОШИБКУ ВРЕМЕНИ ВЫПОЛНЕНИЯ
И МНЕ НУЖНО СОХРАНИТЬ ЗНАЧЕНИЯ В HASHMAP И ИЗ ЭТОГО МНЕ НУЖНО РАСПЕЧАТАТЬ ЗНАЧЕНИЯ И ПОКАЗАТЬ ИХ В КАЧЕСТВЕ ВЫХОДНЫХ ДАННЫХ

Рейтинг:
0

Patrice T

Цитата:
Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 2
в com.imatrix.Test.main(Test.java:29

Это означает, что ваш код пытается получить доступ к месту, которое не существует в массиве.
Поскольку строка 29 не имеет доступа к массиву в вашем коде, мы можем только догадываться, что что-то пошло не так, когда вы его скопировали, только отладчик может сказать вам, что происходит.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html[^]
https://www.jetbrains.com/idea/help/debugging-your-first-java-application.html[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

[Обновление]
Между прочим
while((line = bufferedReader.readLine()) != null) {
    String[] splitted = line.split("~");

     String fisrt=splitted[0];
     String secod=splitted[1];
     String third=splitted[2];

    System.out.println(fisrt+"="+secod+"="+third);
}

Вы должны посмотреть на функцию replace RegEx, она выглядит более подходящей, чем split.