-2

当我运行 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 个小时才找到问题,但就在一秒钟之内,它就被解决了,而且没有让我知道发生了什么。!总之谢谢各位大侠的热心帮助~~

4

3 回答 3

2

你应该初始化p. Person pnull在开始。cmd仅当is时,您才创建 Person 的对象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())

编辑 :

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

catch(Exception e)
{
    e.printStackTrace();
    System.out.println("Error");
    return null;
}
于 2013-05-11T13:01:13.583 回答
1

你的空对象

很有可能,您的文件包含一个不等于name. 在这种情况下,因为p只在第一个实例化if block,你会从中得到一个NullPointerException

忽略设计缺陷,我注意到它Person有一个无参数构造函数。在这种情况下,将该实例移到开头并没有什么坏处。

Person p = new Person();

// Resume if else tree.

另一个潜在问题

在相同的场景中,如果您没有首先获得“名称”,您将尝试在 index 处存储一个值-1,因为这个实例化:

int index = -1;

如何使用 e.printStackTrace()

在你的catch条款中,你有这个:

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

只需简单地将代码替换为:

catch(Exception e)
{
    e.printStackTrace();
}
于 2013-05-11T12:57:35.813 回答
1

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

于 2013-05-11T12:58:13.780 回答