ArrayList:thread中的异常;“主要”;java.lang.NullPointerException
我在尝试添加person时仍然存在问题。假设代码检测到无效的姓名和生日,并且不会将此人添加到personList中。但是,因为在代码读取之前我无法获得生日,所以只能在循环完成时添加person对象。当我尝试测试添加invlid人名和/或生日时,就会出现问题。它表明: 添加人员失败:名称无效 新纪录: 名称:空“ 生日:不知名的杜布 已添加ArrayList:thread中的异常;“主要”;java.lang.NullPointerException,java,exception,arraylist,Java,Exception,Arraylist,我在尝试添加person时仍然存在问题。假设代码检测到无效的姓名和生日,并且不会将此人添加到personList中。但是,因为在代码读取之前我无法获得生日,所以只能在循环完成时添加person对象。当我尝试测试添加invlid人名和/或生日时,就会出现问题。它表明: 添加人员失败:名称无效 新纪录: 名称:空“ 生日:不知名的杜布 已添加 Exception in thread "main" java.lang.NullPointerException at Instruction.readIn
Exception in thread "main" java.lang.NullPointerException
at Instruction.readInstruction(Instruction.java:272)
at EPB.main(EPB.java:12)
else if(words[0].equalsIgnoreCase("add"))
{
Person p = new Person();
String s1 = line.substring(words[0].length()).trim();
String[] s2 = s1.split(";");
if(s2.length>=2)// s2[0] = " name Testing Three" s2[1] = " birthday 13-05-1981" and s2[2]=" address.."
{
for(int i=0; i<s2.length;i++)
{
String s3 = s2[i].trim(); // "delete the leading space" s2[0] = "name Testing Three" s2[1] = "birthday 13-05-1981"
String[] s4 = s3.split("\\s+"); //s4[0] = name; s4[1] = Testing; s4[2]=Three
if(s4.length>=2) // s2[1]=birthday 13-05-1986 only has length of 2
{
if(s4[0].equalsIgnoreCase("name"))
{
//System.out.println(s4[1]);
String name="";
if(Functions.nameValidation(s4[1]))
{
for(int j=2;j<s4.length;j++)
{
name = s4[1] + " " + s4[j];
}
if(Functions.nameValidation(name))
{
p.setName(name);
}
else
{
System.out.println("Failed to add person: Invalid name!");
break;
}
}
else
{
System.out.println("Failed to add person: Invalid name!!");
break;
}
}//end of word equals to name
//-----------------------------------------------------------------
else if(s4[0].equalsIgnoreCase("birthday") && s4.length ==2)
{
if(Functions.dateValidation(s4[1]))
{
try
{
p.setBirthdayString(s4[1]);
}
catch (ParseException e)
{
//e.printStackTrace();
}
}
else
{
System.out.println("Failed to add person: Invalid Birthday Format");
break;
}
}
//end of word equals to birthday
//-----------------------------------------------------------------
boolean notFound = false;
for(Person p1: personList)
{
if(p1.getName().equals(p.getName()))
{
if(p1.getBirthdayString().equals(p.getBirthdayString()))
{
System.out.println("Information in record" +"\n" + "name: "+ p.getName() + "\n" + "Birthday: " + p.getBirthdayString() + "\n" +"has been updated");
p1.setEmail(p.getEmail());
p1.setPhone(p.getPhone());
p1.setAddress(p.getAddress());
notFound = true;
}
}
}
if (!notFound)
{
if(Functions.nameValidation(p.getName()) && Functions.dateValidation(p.getBirthdayString()))
{
System.out.println("New record: " +"\n"+"Name: " + p.getName() + "\""+ "\n"+ "Birthday: " + p.getBirthdayString() + "\nhas been added!");
personList.add(p);
}
FileIO.outData(personList, outputFileName);
}
System.out.println();
}
线程“main”java.lang.NullPointerException中的异常
at Instruction.readInstruction(Instruction.java:272)
位于EPB.main(EPB.java:12)
else if(字[0]。相等信号案例(“添加”))
{
人员p=新人员();
字符串s1=line.substring(单词[0].length()).trim();
字符串[]s2=s1。拆分(“;”);
如果(s2.length>=2)//s2[0]=“姓名测试三”s2[1]=“1981年5月13日生日”和s2[2]=“地址…”
{
for(int i=0;i=2)//s2[1]=生日1986年5月13日的长度仅为2
{
如果(s4[0]。相等信号案例(“名称”))
{
//系统输出打印Ln(s4[1]);
字符串名称=”;
if(函数名验证(s4[1]))
{
对于(int j=2;j这就是问题所在:
for(Person p1: personList)
{
...
personList.add(p);
}
您不能在迭代集合时对其进行修改。最简单的修复方法可能是在迭代personList
时创建一个单独的列表,然后将所有内容添加到其中:
List<Person> newPeople = new ArrayList<Person>();
for(Person p1: personList)
{
...
newPeople.add(p);
}
personList.addAll(newPeople);
List newPeople=new ArrayList();
用于(人员p1:人员列表)
{
...
新增(p);
}
personList.addAll(newPeople);
(正如Peter指出的,您可能无论如何都不想添加此项,但这就是为什么会出现异常。)您正在遍历personList并检查此列表是否包含Name和BirthdayString值。这没有意义,因为此列表仅包含Person对象 您的问题是,在迭代时向该列表添加新对象,如果包含检查失败,则会导致异常:
System.out.println("New record has been added!");
personList.add(p);
基本上,您需要重新考虑您的包含检查,而不是修改您正在迭代的集合。我想您的问题是您不知道在哪里查找。这里有一个问题
for(Person p1: personList)
{
if(personList.contains(p.getName()))
{
if(!personList.contains(p.getBirthdayString()))
{
System.out.println("New record has been added!");
personList.add(p);
您正在修改列表,同时对其进行迭代
这很可能是一个bug,而不是你应该用另一种方式去做的事情。我认为在最后一个循环中应该做什么,而不是迭代
personList
,并在每个步骤中检查它是否包含p
的名称和生日,就是检查迭代中每个元素的条件,类似这样:
p1.getName().equals(p.getName())
而不是personList.contains(p.getName())
及
而不是personList.contains(p.getBirthdayString())
这将修复逻辑错误和异常,因为在遍历集合时不会调用contains
编辑:
然后您仍然会有一个错误,您试图在同一个循环中将p
添加到personList
(在“else”块中:personList.add(p)
)。您现在这样做的方式不仅是为您获取一个异常,而且它还尝试为列表中不等于它的每个p1
添加personp
。要解决此问题,您需要在循环中保留一个布尔值,以检查是否找到任何匹配项(如果检查了上述p1的任何条件,则为true),并将p
添加到personList
外循环,如果所述布尔值不为真
总之,这是迭代循环的修改代码:
boolean-found=false;
用于(人员p1:人员列表)
{
if(p1.getName.equals(p.getName()))
{
if(p1.getBirthdayString.equals(p.getBirthdayString()))
{
System.out.println(“记录“+”\n“+”名称中的信息:“+p.getName()+”\n“+”生日:“+p.getBirthdayString()+”\n“+”已更新”);
p1.setEmail(p.getEmail());
p1.setPhone(p.getPhone());
p1.setAddress(p.getAddress());
FileIO.outData(personList,outputFileName);
发现=真;
}
}
}
如果(!找到)
{
System.out.println(“添加了新记录!”);
添加(p);
FileIO.outData(personList,outputFileName);
}
以后,请尝试将您的问题缩小为一个简短但完整的程序来演示问题。您在此处给出了很多代码,其中大部分与问题无关。+0很可能是原始代码完全错误。添加的人已经在列表中。您完全正确。您提供了很大的帮助。谢谢很多
p1.getBirthdayString().equals(p.getBirthdayString())