2013-11-13 2 views
1

Я потратил бесчисленные часы на эту часть моего кода, которая дает мне исключение Null Pointer. Я не понимаю, почему это происходит или как остановить его. Я пробовал каждый метод, ранее опубликованный в stackoverflow. Вот функция, которая читает файл данных и помещает каждую строку в хэш-карту.Ошибка NullPointerException в Hashmap

public ArrayList<HashMap<String, String>> readDataFromFile(){ 
    this.openFileForReading(); 
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>(); 
    try{ 
     String line; 

     while ((line = this.reader.readLine()) != null){ 

      while (!(line.equals(""))){ 

       if (line.equals("[type = book]")){ 
        HashMap<String, String> data= new HashMap<>(); 
        line = this.reader.readLine(); 

        while (!(line.equals(""))){<----this is where the null exception error is 

         String tokens[] = line.split("="); 
         data.put(tokens[0], tokens[1]); 
         System.out.println(tokens[0] + " " + tokens[1]); 
         line = this.reader.readLine(); 

        } 
        list.add(data); 
       } 
       else{ 
        break; 
       } 
      } 

     } 
    } 
    catch (IOException exception) { 
     list = null; 
     System.err.println("(FileIO): " + exception);    
    } 
    // Close the file when we have finished reading or if an error occurs 
    finally { 
     try { 
      this.reader.close();     
     } catch (IOException exception) { 
      System.err.println("(FileIO): " + exception); 
     } 
    } 

    return list; 
} 

Я затем запустить его в основном с этим:

public static void main (String args[]) {         
    FileIO fileIO = new FileIO(DATA_FILE_PATH); 
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>(); 
    list = fileIO.readDataFromFile(); 

} 
run: 

callnumber QA76.73.J38S265 авторы Вальтер Савича, Kenrich Mock название Absolute Java издатель Addison-Wesley год 2009 номер телефона P98.C6116 название Computati нальная Лингвистика Исключение в потоке «основной» java.lang.NullPointerException организация Ассоциация по вычислительной лингвистике в librarysearch.FileIO.readDataFromFile (FileIO.java:160) год 2008 на librarysearch.FileIO.main (FileIO.java:405) Java Результат: 1 BUILD УСПЕШНОГО (общее время: 1 второе)

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

+0

Опубликовать полное исключение из трассировки стека. –

+0

Опубликовать полное дерево исключений –

+0

Первое, что нужно сделать: прочитать трассировку стека исключений (или опубликовать ее, если вы не можете ее понять). Сообщения об ошибках предназначены для чтения. Они рассказывают вам, что и где проблема. Не читая их, вы стреляете в ногу, и то, что можно решить за 10 секунд, нужно решить. –

ответ

3

Вы потребляя новую строку без проверки нулевой:

HashMap<String, String> data= new HashMap<>(); 
line = this.reader.readLine(); <--- i mean this, and line can be null 

while (!(line.equals(""))){<----this is where the null exception error is 

Я даю вам общий совет:

Никогда сравнить переменную типа String против строки буквальным таким образом:

if (myStringWhichCanBeNull.equals("my literal which is never null")) // ... 

но всегда так:

if ("my literal which is never null".equals(myStringWhichCanBeNull)) // ... 

Во многих случаях вы избежите применения NPE и получите более надежный код!

(я не говорю, что в данном случае это было сохранено ваше живое ...)

+0

Это сработало! вроде. Я добавил некоторое время (line! = Null) перед line.equals ("), и теперь он не дает ошибку, но останавливается на первой пустой строке – user2989421

1
line = this.reader.readLine(); 

while (!(line.equals(""))) { 

Вы читаете строку, а затем не проверить, если это нуль перед вызовом equals() на Это. Он будет нулевым, если в файле больше нечего читать, как описано в javadoc метода readLine().

0
line = this.reader.readLine(); 

вероятно возвращает нуль на линии 13 (несчастливый для некоторых)

тогда вы называете .equals на нем

Так что, возможно добавить еще некоторые ошибки проверки

0

Вы должны проверить результат от BufferedReader.readLine() для null везде, где вы вызываете метод.Как сказано в API документации Java, BufferedReader.readLine() возвращает:

Строка, содержащая содержимое строки, не включая любые линии прекращения символов, или ноль, если конец потока был достиг

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

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