2015-02-23 2 views
0

Я создал программу, которая читает текстовый файл, содержащий твиты. Этот текстовый файл составляет 16 МБ, поэтому он очень большой. Моя программа читает его по строкам и добавляет слова в ArrayList. Выполняя это, я получил ArrayIndexOutOfBoundsException. Я отлаживал свой код, чтобы расстаться с его исключением. Я заметил, что код продолжает работать после исключения исключения и добавляет слова в ArrayList.Java Добавление больших данных ro ArrayList

java.lang.ArrayIndexOutOfBoundsException: 0 
    at Test.main(Test.java:39) 
java.lang.ArrayIndexOutOfBoundsException: 0 
    at Test.main(Test.java:39) 
java.lang.ArrayIndexOutOfBoundsException: 0 
    at Test.main(Test.java:39) 
java.lang.ArrayIndexOutOfBoundsException: 0 
    at Test.main(Test.java:39) 
#Jobs: 272 
#Job: 269 
#jobs: 225 
#TweetMyJOBS: 223 
#job: 155 

Так выглядит на консоли. После нескольких исключений моя программа запускается и отображает результат. Результат также неверен. Например, сначала нужно #Jobs: 4251. Кто-нибудь есть идея, почему он будет бросать исключение, а затем продолжает работать?

вот код:

try 
     { 
      line = reader.readLine(); 
      // scan = new Scanner(textinput); 
      while (line != null) 
      { 

       String[] splitted = line.split("#"); // Line splitted according to "#". 

       for (int x = 1; x < splitted.length; x++) 
       { 
       String[] temp = splitted[x].split(" "); // String splitted with space and first word is hashtag. 
       try 
       { 
        //Line 39 is here. 
        hashtags.add(temp[0]); // hashtag added to ArrayList. 

       } catch (ArrayIndexOutOfBoundsException e) 
       { 
        e.printStackTrace(); 
       } 

      } 
      line = reader.readLine(); 
      linenum++; 
     } 

    } catch (FileNotFoundException e1) 
    { 
     e1.printStackTrace(); 
    } 
+0

Как мы можем помочь вам, не видя код? – WeSt

+3

Можете ли вы показать свой код? Что в строке 39? – Eran

+0

при вставке в arraylist, вы вставляете, указав номер индекса? – Vihar

ответ

0

ArrayIndexOutOfBounds исключения не вызваны большим количеством данных. Они вызваны, когда вы пытаетесь получить доступ к элементу, который не существует.

int[] apples = new int[5]; 
apples[7]; 

Это дало бы мне ArrayIndexOutOfBoundsException, потому что apples [7] не существует.

+0

Я получаю первое исключение, когда ArrayList имеет размер 14053 и при добавлении 10596-го элемента. Это не должно быть вне пределов, верно? – berkc

+0

Я не вижу, как. Попробуйте, чтобы ваша программа распечатывала размер ArrayList с каждой итерацией цикла. Затем проверьте значение прямо перед исключением, чтобы узнать, появилось ли что-нибудь интересное. –

1

16MB не большой. Ваш код продолжает работать, потому что вы обнаруживаете исключение и просто показываете стек. Исключение составляет temp, являющийся массивом нулевой длины, скорее всего потому, что splitted[x] был пустой строкой.

Хорошим способом отладки кода является печать (или запись) значений во время извлечения, особенно когда выбрано исключение.

+0

Если я попытаюсь добавить пустую строку в ArrayList, это исключение произойдет? – berkc

+0

Нет, вы пытаетесь получить доступ к пустому массиву. Пустые массивы не имеют никаких элементов, поэтому нет индекса, к которому вы можете получить доступ, не получая 'IndexOutOfBounds'. Покажите свои переменные в блоке catch, и вы увидите, что происходит. – Kayaman

+0

Как я могу отобразить их на блоке catch? – berkc

Смежные вопросы