当我运行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个小时才发现问题,但只是在一秒钟内,它会在不让我知道发生了什么的情况下修复。 无论如何,谢谢你们的善意帮助~~
答案 0 :(得分:2)
您应该初始化p
。 Person p
一开始就是null
。仅当cmd
为name
时才创建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。您编写的代码很可能取决于您提供的输入。 (这很危险)