-2

当我尝试添加人员时,我仍然遇到问题。该代码假设检测​​无效的姓名和生日,并且不会将此人添加到 personList 中。但是,由于在代码读取之前我无法获得生日,因此只能在循环完成时添加 person 对象。当我尝试测试添加无效的人名和/或生日时会出现问题。表明:

添加人员失败:姓名无效!!

新纪录:

名称:空"

生日:未知出生日期

已添加!

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();
                }
4

4 回答 4

8

这就是问题:

for(Person p1: personList)
{
    ...
    personList.add(p);
}

迭代集合时不能修改集合。最简单的解决方法可能是在迭代时建立一个单独personList的列表,然后将所有内容添加到其中:

List<Person> newPeople = new ArrayList<Person>();
for(Person p1: personList)
{
    ...
    newPeople.add(p);
}
personList.addAll(newPeople);

(正如彼得指出的那样,你可能不想添加这个-但这就是你得到例外的原因。)

于 2013-05-14T18:24:21.617 回答
3

我认为在最后一个循环中要做的不是迭代personList并在每一步检查它是否包含的名称和生日,而是检查p迭代中每个元素的条件,如下所示:

p1.getName().equals(p.getName())

代替personList.contains(p.getName())

p1.getBirthdayString().equals(p.getBirthdayString())

代替personList.contains(p.getBirthdayString())

这将修复逻辑错误以及异常,因为您不会contains在遍历集合时调用。

编辑:那么你仍然会有一个错误,你试图添加ppersonList同一个循环中(在“else”块中:)personList.add(p)。您现在这样做的方式不仅是让您获得例外,而且还试图为列表中不等于它的p每个人添加人员。p1要解决此问题,您需要在循环内保留一个布尔值,以检查是否找到任何匹配项(如果曾经检查过上述 p1 的任何条件,则为真),如果所述布尔值不为真,则添加ppersonList循环外。

总之,这是迭代循环的修改代码:

boolean found = 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());
                    FileIO.outData(personList, outputFileName);

                    found = true;
                 }

            }

        }
if (!found)
{
        System.out.println("New record has been added!");
        personList.add(p);
        FileIO.outData(personList, outputFileName); 
}
于 2013-05-14T18:43:39.020 回答
0

您正在遍历 personList 并检查此列表是否包含 Name 和 BirthdayString 值。这是没有意义的,因为这个列表只包含 Person 对象。

而您的问题是,如果包含检查失败,则在迭代时将新对象添加到此列表中,这会导致异常:

System.out.println("New record has been added!");
personList.add(p);

基本上,您需要重新考虑您的包含检查,而不是修改您正在迭代的集合。

于 2013-05-14T18:25:56.823 回答
0

我想你的问题是你不知道去哪里找。你这里有问题

                    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);

您在迭代列表时正在修改您的列表。

这很可能是一个错误,而不是您应该以其他方式执行的操作。

于 2013-05-14T18:26:08.027 回答