Java 使用NullPointerException停止的循环的增强

Java 使用NullPointerException停止的循环的增强,java,for-loop,arraylist,Java,For Loop,Arraylist,我的增强for循环似乎没有正确迭代。其目的是使用search类遍历Contact类型的ArrayList并查找特定名称,但由于某些原因,它只遍历第一个Contact,并在显示以下内容后停止并出现错误: Exception in thread "main" java.lang.NullPointerException at client.AddressBook.search(AddressBook.java:17) at Main.main(Main.java:31) 我的主要课

我的增强for循环似乎没有正确迭代。其目的是使用search类遍历Contact类型的ArrayList并查找特定名称,但由于某些原因,它只遍历第一个Contact,并在显示以下内容后停止并出现错误:

Exception in thread "main" java.lang.NullPointerException
    at client.AddressBook.search(AddressBook.java:17)
    at Main.main(Main.java:31)
我的主要课程如下:

import client.AddressBook;
import client.Contact;

public class Main {

    public static void main(String[] args) {

        AddressBook ab = new AddressBook();

        Contact c1 = new Contact("jeffm@engr.uconn.edu");
        ab.add(c1);

        Contact c2 = new Contact("jeffm@engr.uconn.edu", "Jeff Meunier", "jeff");
        ab.add(c2);

        Contact c3 = new Contact("billgates@engr.uconn.edu", "Bill Gates", "bill");
        ab.add(c3);

        System.out.println(ab.search("jeff"));
    }

}
package client;
import java.util.ArrayList;

public class AddressBook {

    ArrayList<Contact> al = new ArrayList<Contact>();

    public void add(Contact contactAdd) {

        al.add(contactAdd);
    }

    public Contact search(String searchName) {

        for(Contact obj: al) {

            if(obj.getNickName().equals(searchName)) {
                return obj;
            }
        }
        return null;
    }

    public String remove(String nickname) {

        search(nickname);
        al.remove(nickname);

        return nickname;
    }

    public void show() {

        int x = 1;
        for(Contact obj: al) {

            System.out.println(x + ". " + obj.toString());
            x++;
        }
    }
}



package client;

public class Contact {

    public String _emailAddress = null;
    public String _fullName = null;
    public String _nickName = null;

    public Contact(String emailaddress, String fullname, String nickname) {

        _emailAddress = emailaddress;
        _fullName = fullname;
        _nickName = nickname;
    }

    public Contact(String emailaddress) {

        _emailAddress = emailaddress;
    }

    @Override
    public String toString() {

        if(_fullName == null & _nickName == null) {

            //System.out.println("<" + _emailAddress + ">");
            return _emailAddress;
        }
        else {
            //System.out.println(_fullName + " (" + _nickName + ") " + "<" + _emailAddress + ">");
            return _fullName + " (" +  _nickName + ") " + "<" + _emailAddress + ">";
        }
    }

    public String getNickName() {

        return _nickName;
    }
}
地址簿和联系人类别也列在下面:

import client.AddressBook;
import client.Contact;

public class Main {

    public static void main(String[] args) {

        AddressBook ab = new AddressBook();

        Contact c1 = new Contact("jeffm@engr.uconn.edu");
        ab.add(c1);

        Contact c2 = new Contact("jeffm@engr.uconn.edu", "Jeff Meunier", "jeff");
        ab.add(c2);

        Contact c3 = new Contact("billgates@engr.uconn.edu", "Bill Gates", "bill");
        ab.add(c3);

        System.out.println(ab.search("jeff"));
    }

}
package client;
import java.util.ArrayList;

public class AddressBook {

    ArrayList<Contact> al = new ArrayList<Contact>();

    public void add(Contact contactAdd) {

        al.add(contactAdd);
    }

    public Contact search(String searchName) {

        for(Contact obj: al) {

            if(obj.getNickName().equals(searchName)) {
                return obj;
            }
        }
        return null;
    }

    public String remove(String nickname) {

        search(nickname);
        al.remove(nickname);

        return nickname;
    }

    public void show() {

        int x = 1;
        for(Contact obj: al) {

            System.out.println(x + ". " + obj.toString());
            x++;
        }
    }
}



package client;

public class Contact {

    public String _emailAddress = null;
    public String _fullName = null;
    public String _nickName = null;

    public Contact(String emailaddress, String fullname, String nickname) {

        _emailAddress = emailaddress;
        _fullName = fullname;
        _nickName = nickname;
    }

    public Contact(String emailaddress) {

        _emailAddress = emailaddress;
    }

    @Override
    public String toString() {

        if(_fullName == null & _nickName == null) {

            //System.out.println("<" + _emailAddress + ">");
            return _emailAddress;
        }
        else {
            //System.out.println(_fullName + " (" + _nickName + ") " + "<" + _emailAddress + ">");
            return _fullName + " (" +  _nickName + ") " + "<" + _emailAddress + ">";
        }
    }

    public String getNickName() {

        return _nickName;
    }
}
包客户端;
导入java.util.ArrayList;
公共类通讯簿{
ArrayList al=新的ArrayList();
公共作废添加(联系联系人添加){
al.add(contactAdd);
}
公共联系人搜索(字符串搜索名称){
对于(联系对象:al){
if(obj.get昵称().equals(searchName)){
返回obj;
}
}
返回null;
}
公共字符串删除(字符串昵称){
搜索(昵称);
al.删除(昵称);
返回昵称;
}
公开展览({
int x=1;
对于(联系对象:al){
System.out.println(x+““+obj.toString());
x++;
}
}
}
包客户端;
公共类联系人{
公共字符串_emailAddress=null;
公共字符串_fullName=null;
公共字符串_昵称=null;
公共联系人(字符串电子邮件地址、字符串全名、字符串昵称){
_emailAddress=电子邮件地址;
_全名=全名;
_昵称=昵称;
}
公共联系人(字符串电子邮件地址){
_emailAddress=电子邮件地址;
}
@凌驾
公共字符串toString(){
如果(_fullName==null&_昵称==null){
//System.out.println(“”);
返回电子邮件地址;
}
否则{
//System.out.println(_fullName+”(“+_昵称+”)+”);
返回“全名+”(“+”昵称+”)+”;
}
}
公共字符串get昵称(){
return_昵称;
}
}

如果有人能提出任何建议,我们将不胜感激。最后,我现在只测试search类是否可以搜索指定的昵称,然后打印出该昵称的返回值。显然,它应该返回第二次接触(或者至少这是目的)

此验证中出现问题:

 if(obj.getNickName().equals(searchName)) {
     return obj;
 }
public Contact search(String searchName) {

    for(Contact obj: al) {
        //I assume that searchName will never be null
        if(searchName.equals(obj.getNickName()) {
            return obj;
        }
    }
    return null;
}
似乎
obj.get昵称()
有时可能为空

更改验证的顺序:

 if(obj.getNickName().equals(searchName)) {
     return obj;
 }
public Contact search(String searchName) {

    for(Contact obj: al) {
        //I assume that searchName will never be null
        if(searchName.equals(obj.getNickName()) {
            return obj;
        }
    }
    return null;
}

您添加的第一项不包括昵称。在你的搜索中,你得到了昵称,并在一个空引用上调用了equals()。

很好的发现,我正要发布它。但是你可以早点发布。但我认为最好的解决方案是在这种情况下使用Jean-François Savard的答案。感谢您的帮助,这是问题所在,并返回正确的联系方式,现在我可以假设搜索不会为空。