2016-05-30 3 views
0

Я пытаюсь прочитать идентификатор пользователей и их тип ссылки из файла txt. Данные приведены в следующем формате.Как решить java.lang.ArrayIndexOutOfBoundsException error

SRC:aa 
TGT:bb 
VOT:1 

SRC:cc 
TGT:bb 
VOT:-1 

где индикаторы «SRC» и «TGT» идентификатора пользователей. В данных, некоторых пользователях идентификаторы являются пустыми, то есть пользователи не согласны раскрыть свою личность следующим образом:

SRC: 
TGT:cc 
VOT:-1 

SRC:ff 
TGT:bb 
VOT:1 

В этом случае, я хочу, чтобы дать им специальный идентификатор, «анонимным». Итак, я написал следующий код:

//Reading source 
dataline = s.nextLine(); 
String[] line1parts = new String[2]; 
. 
. 
//split the line at ":" 
line1parts = dataline.split(":"); 
//if the line has source 
if (line1parts[0].trim().equals("SRC")){ 
    //if the soruce name is empty 
    if (line1parts[1].isEmpty()) { 
     src = "anonymous"; 
     System.out.print("src: " + src); 
    } 
    //if the source already integer id 
    else { 
     src = line1parts[1].trim(); 
     System.out.print("src: " + src); 
    } 
} 

Программа показывает java.lang.ArrayIndexOutOfBoundsException ошибку. Я также пробовал if (line1parts[1].equals("") и if (line1parts[1].equals(null). Вероятно, для случая SRC: (when empty) массив строк не создает никакого объекта (извините, если я ошибаюсь. Я очень новичок в java). Как назначить идентификатор пользователя, когда он пуст? Заранее спасибо.

+0

Можете ли вы наметить линию, на которой происходит эта ошибка? Вы можете отредактировать свой пост. – Arc676

+0

Вы проверили индекс '[0]' для того, чтобы данные существовали? –

+0

Единственная причина в том, что 'line1Parts' имеет только 1 ячейку, вы можете заставить метод split вернуть 2 ячейки, указав это значение после String (второй параметр, целое число) – AxelH

ответ

2

Если строка содержит только SRC:, то в массиве line1parts будет только один элемент, поэтому line1parts[1] вызывает исключение ArrayIndexOutOfBoundsException.

if (line1parts[1].isEmpty()) Заменить на if (line1parts.length < 2)

+1

Я забыл эту глупую логику с расколом ... спасибо. – AxelH

0

Имеет StephaneM заставил меня вспомнить, метод раскола подрезать пустую ячейку в процессе расщепления. Это удалило все пустые ячейки в конце. Это означает пустую ячейку, если нет значения SRC в вашем случае

Чтобы предотвратить это, вы можете вызвать

java.lang.String.split (String, Int)

Это целое число задает длину требуемого массива, как минимум.

line1parts = dataline.split(":", 2); 

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

Хорошее мнение, что нужно знать, что если вы отправите -1, раскол вернет КАЖДЫЕ ячейки. Никакой обрезки не выполняется.

0

Вы пытаетесь получить индекс, которого нет.

split() помогает разделить значение из регулярного выражения, которое вы предоставили.

вы разделите строку 1. «TGT: cc» в этом случае разделить метод split String от «:» и возвращает массив размером 2, т. Е. [TGT, cc] (он имеет 0 и 1 индекс).

2.Когда вы разделите строку «SRC:», в этом случае метод split создаст массив размером 1, то есть [SRC] (он имеет только индекс 0), потому что в этой строке после «:» ничего и так не создает дополнительный индекс для нулевого значения.

При вызове "line1parts [1] .isEmpty()" это бросить ArrayIndexOutOfBoundsException, потому что он не имеет индекс 1.

Здесь вы должны проверить "line1parts.length" перед вызовом «line1parts [1] .пусто()".

line1parts = dataline.split(":"); 
    // if the line has source 
    if (line1parts[0].trim().equals("SRC")) { 

     if (line1parts.length > 1) { 

      // if the soruce name is empty 
      if (line1parts[1].isEmpty()) { 
       src = "anonymous"; 
       System.out.print("src: " + src); 
      } 
      // if the source already integer id 
      else { 
       src = line1parts[1].trim(); 
       System.out.print("src: " + src); 
      } 
     } 
    } 

Или -----------------

Вы должны сделать ::

line1parts = dataline.split (":", 2);