2013-05-11 3 views
-2

Когда я запускаю основной метод, следующие продолжал появляться:FileIO - исключение в потоке «главный» NullPointerException

Exception in thread "main" java.lang.NullPointerException 

Я проверил мой код, но не смог найти какой-либо неинициализированный переменной. Может кто-нибудь, пожалуйста, помогите мне?

import java.io.FileNotFoundException; 
import java.io.File; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.Scanner; 


public class FileIO 
{ 
public static ArrayList<Person> readData(String fileName) 
{ 
    ArrayList<Person> personList = new ArrayList<Person>(); 
    int index = -1; 
    try 
    { 
     File file = new File(fileName); 
     Scanner reader = new Scanner(file); 
     String s; 
     Person p = null; 
     boolean addressActive = false; 
     while (reader.hasNext()) 
     { 
      s = reader.nextLine(); 
      Scanner line = new Scanner(s); 
      String cmd; 

      if(line.hasNext()) 
      { 
       cmd = line.next(); 

       if(cmd.equalsIgnoreCase("name")) 
       { 
        index++; 
        p = new Person(); 
        p.setName(line.nextLine()); 
        personList.add(index,p); 
        addressActive = false; 
       } 

       else if(cmd.equalsIgnoreCase("birthday")) 
       { 
        if(line.hasNext()) 
        { 
         p.setBirthday(line.nextLine()); 
         personList.set(index, p); 
        } 
        addressActive = false; 

       } 

       else if(cmd.equalsIgnoreCase("phone")) 
       { 
        if(line.hasNext()) 
        { 
         p.setPhone(line.nextLine()); 
         personList.set(index, p); 
        } 
        addressActive = false; 
       } 

       else if(cmd.equalsIgnoreCase("email")) 
       { 
        if(line.hasNext()) 
        { 
         p.setEmail(line.nextLine()); 
         personList.set(index, p); 
        } 
        addressActive = false; 
       } 

       else if(cmd.equalsIgnoreCase("address")) 
       { 
        p.setAddress(line.nextLine()); 
        personList.set(index, p); 
        addressActive = true; 
       } 

       else if(addressActive) 
       { 
        String address = p.getAddress() + " " + s; 
        p.setAddress(address); 
        personList.set(index, p); 
       } 

       else 
        System.out.println("Error: no command" +s); 
      } 


     } 
     reader.close(); 
     return personList; 
    } 
    catch(Exception e) 
    { 
     System.out.println("Error"); 
     return null; 
    } 

} 
} 

import java.util.ArrayList; 


public class Test { 

public static void main(String[] args) { 

ArrayList<Person> person1 = FileIO.readData("C:/Users/phoenix/Desktopsample_phonebook1.txt"); 


System.out.println(person1.size()); 

} 
} 

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

+4

An Исключением является номер строки. Добавьте e.printStackTrace() в предложение catch. –

+0

И в зависимости от вашего файла p вполне может быть нулевым. –

+3

Фактически, вы получите трассировку стека, удалив пряди, которая ее скрывает. Выньте свой блок Try/catch, так как вам лучше не иметь его. –

ответ

1

Ваш несуществующий объект

Шансы, ваш файл содержит маркер, который не равен name. В этом случае, поскольку p создается только в первом if block, вы получите NullPointerException.

Игнорируя недостатки дизайна, я заметил, что Person не имеет конструктора параметров. В этом случае нет вреда при перемещении этого экземпляра в начало.

Person p = new Person(); 

// Resume if else tree. 

Другой потенциальной проблемой

В том же случае, если вы не получите «имя» первым, вы будете пытаться сохранить значение по индексу -1, из-за этого экземпляра:

int index = -1; 

Как использовать e.printStackTrace()

I п ваше положение catch, у вас есть это:

catch(Exception e) 
{ 
    System.out.println("Error"); 
    return null; 
} 

Просто замените код:

catch(Exception e) 
{ 
    e.printStackTrace(); 
} 
+0

Да, я пробовал. Но это не работает. – user2372861

+0

Покажи нам свой файл. – christopher

+0

int index = -1 означает. когда программа читает файл, он читает «Имя». номер индекса добавит 1 равный 0, указав первый индекс в arraylist, затем я создам новый объект – user2372861

1

Вы только создать человека, которого вы «имя» дается. Если вы запустите любой другой код, вы получите NPE. Вполне вероятно, что ваш код зависит от ввода, который вы ему даете. (Что является опасным)

2

Вы должны инициализировать p. Person p - null в начале. Вы создаете объект Person только тогда, когда cmd - name. Кроме того, вы пытаетесь получить доступ к нулевой ссылке, что приводит к NullPointerException Итак, вы хотите инициализировать p вместо makint null с самого начала. Вы можете сделать это здесь:

try 
{ 
    File file = new File(fileName); 
    Scanner reader = new Scanner(file); 
    String s; 
    Person p = new Person(); // Initialize Person object 
    boolean addressActive = false; 
    while (reader.hasNext()) 

EDIT:

Если вы до сих пор не может избавиться от исключения, используйте метод printStacktrace улова блока следующим образом:

catch(Exception e) 
{ 
    e.printStackTrace(); 
    System.out.println("Error"); 
    return null; 
} 
+0

Да, я пробовал. Но это не работает. – user2372861

+2

@ user2372861. Тогда вы должны использовать 'e.printStacktrace();' в своем блоке catch, чтобы найти, где именно происходит NPE. –

+0

+1 для 'printStackTrace()' комментарий. –

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