【问题标题】:Enhanced for-loop stopped with NullPointerException增强的 for 循环因 NullPointerException 而停止
【发布时间】:2015-06-23 17:36:25
【问题描述】:

我的增强 for 循环似乎没有正确迭代。目的是使用搜索类遍历 Contact 类型的 ArrayList 并找到特定名称,但由于某种原因,它只遍历第一个联系人并在显示后停止并出现错误:

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

}

AddressBook 和 Contact 类也在下面列出:

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 for-loop arraylist


    【解决方案1】:

    问题发生在这个验证中:

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

    似乎obj.getNickName() 有时可能为空。

    更改验证顺序:

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

    【讨论】:

    • 感谢您对问题的帮助并返回正确的联系人,因为我可以假设搜索不会为空。
    【解决方案2】:

    您添加的第一个项目不包含昵称。在您的搜索中,您会获得昵称并在 null 引用上调用 equals()。

    【讨论】:

    • 很高兴我将发布它。不过你发的早。但我认为最好的解决方案是在这种情况下使用 Jean-François Savard 的答案。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 2014-02-23
    • 2012-12-04
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多