FileIO - 线程“main”NullPointerException中的异常

时间:2013-05-11 12:52:21

标签: java file-io io nullpointerexception

当我运行main方法时,以下内容不断弹出:

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个小时才发现问题,但只是在一秒钟内,它会在不让我知道发生了什么的情况下修复。 无论如何,谢谢你们的善意帮助~~

3 个答案:

答案 0 :(得分:2)

您应该初始化pPerson p一开始就是null。仅当cmdname时才创建Person对象。除此之外,您尝试访问空引用,这将导致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())

编辑:

如果仍然无法摆脱异常,请在catch块中使用printStacktrace方法,如下所示:

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

答案 1 :(得分:1)

您的空对象

可能的情况是,您的文件包含的代码不等于name。在这种情况下,由于p仅在第一个if block中实例化,因此您将获得NullPointerException

忽略设计缺陷,我注意到Person有一个无参数构造函数。在这种情况下,将实例化移动到开始是没有害处的。

Person p = new Person();

// Resume if else tree.

另一个潜在问题

在同一场景中,如果您没有首先获得“name”,则会尝试将值存储在索引-1,因为此实例化:

int index = -1;

如何使用e.printStackTrace()

catch条款中,您有:

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

只需将代码替换为:

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

答案 2 :(得分:1)

你只创建一个给你“名字”的人。如果您先运行任何其他代码,您将获得NPE。您编写的代码很可能取决于您提供的输入。 (这很危险)