2013-08-22 8 views
1

Следующий код открывает текстовый файл и разбивает его содержимое на токены с использованием запятой в качестве разделителя. Я использовал код, подобный этому, и он работал нормально, но по какой-то причине это бросает исключение NullPointerException в «myItems [counter] .name = myTokens [counter];»Tokens Null Pointer Exception

public static serial[] getSerials(String fName) throws Exception { 
    String total = null; 
    BufferedReader lineReader = null; 
    lineReader = new BufferedReader(new FileReader(fName)); 
    while ((lineReader.readLine()) != null) { 
     total = total + lineReader.readLine() + ","; 
    } //end while 
    String[] myTokens = total.split(","); /*break the string csv tokens*/ 
    /*Put together the serial objects*/ 
    serial mySerials[] = new serial[myTokens.length]; 
    int counter = 0; 
    while (counter < myTokens.length) { 
     mySerials[counter].name = myTokens[counter]; 
     counter++; 
     mySerials[counter - 1].onlineISSN = myTokens[counter]; 
     counter++; 
    } 
    return mySerials; 
} //end getSerials() 
+0

Вы пытались инициализировать общее количество? как String total = ""; И вы можете использовать StringBuilder для «сборки» строк. – Fernando

+0

Вы говорите, что получаете ошибку на строке 'myItems [counter] .name = myTokens [counter];' -> В вашем коде нет такой строки – BackSlash

+0

Пожалуйста, используйте соглашение об именах Java! Названия классов начинаются со столиц. – ppeterka

ответ

5

Вы инициализируется массив со

serial mySerials[] = new serial[myTokens.length]; 

но не его элементы

mySerials[counter].name // will throw NPE 

Вы должны инициализировать элементы первых перед обращением своим членам

mySerials[counter] = new serial(/* something possibly */); 
1

You создано т он массирует, но не заполняет его. Итак, mySerials[counter] имеет значение null - но вы разыгрываете его. Я думаю, что вы хотите что-то вроде:

mySerials[counter] = new serial(myTokens[counter]); 

... предполагается, что ваш serial класс имеет конструктор вывоза мебели. Или лучше, чтобы обрабатывать обе части:

mySerials[counter] = new serial(myTokens[counter], myTokens[counter + 1]); 
counter += 2; 

Обратите внимание, что только каждый элемент mySerials будет заполняться ... почему бы вам не просто создать List<serial> вместо и добавлять элементы к этому?

Также обратите внимание, что имя serial нарушает соглашения об именах Java для классов. Это стоит как можно раньше использовать хорошие навыки с точки зрения наименования.

0

Вам нужно создать экземпляр Serial объекты в mySerials:

while (counter < myTokens.length) {  
    mySerials[counter] = new Serial(); 
    // ... 
0
while (counter < myTokens.length) { 
    mySerials[counter] = new serial(); 
    mySerials[counter].name = myTokens[counter]; 
    counter++; 
    mySerials[counter - 1].onlineISSN = myTokens[counter]; 
    counter++; 
} 
0

проблема с линией:

mySerials[counter].name = myTokens[counter]; 

только немедленным сверху, вы инициализируется массив Searil, но еще нет элемента

serial mySerials[] = new serial[myTokens.length]; 

так, когда внутри цикла вы пытаетесь получить доступ к mySerials[0] возвратит вас null, как массив по умолчанию принимает значение по умолчанию, и в вашем случае это будет null, и любая операция, вы будете выполнять на null даст вам NPE, чтобы избежать это, вы должны иметь значения внутри вашего array во время создания/инициализации или сразу же после этого, когда вы попытаетесь использовать.