1

我有一组自定义类的元素User。现在我根本无法弄清楚如何实例化这个类。我什至通过创建另一个对象并从那里拉出 EMPTY 集来尝试它,如下所示:

Site mySite = new Site(/*some params here*/);
User newUser = new User(/*some other params here*/);
Set<User> users = mySite.getUsers();
users.add(newUser);
mySite.setUsers(users);

但既然mySite.usersnull(不是空的),我当然会得到一个 NullPointerException。

那么,正确的方法是什么?我将非常感激,并希望这不是含糊的!

干杯,堆叠

4

4 回答 4

7

它不是空的,它是null。空SetSet变量不同null

如有必要,检查null并创建一个新的空的:Set

Set<User> users = mySite.getUsers();
if (users == null) {
    users = new HashSet<User>();
}
users.add(newUser);
mySite.setUsers(users);

或者,如果需要,最好让该mySite.getUsers()方法返回一个空Set值:

public Set<User> getUsers() {
    if (users == null) {
        users = new HashSet<User>();
    }
    return users;
}

那么你就不需要null-check了。

于 2013-11-08T15:25:05.790 回答
5

对空集的引用和空引用之间存在巨大差异。(就像对空字符串的引用和空引用之间存在巨大差异一样。)

听起来您可能应该更改您的Site类(或任何类型mySite),以便getUsers()在没有用户时返回一个空集而不是空引用。一般来说,空集合比空引用更容易使用——它省去了不断执行空值检查的麻烦。

于 2013-11-08T15:23:21.583 回答
1
User newUser = new User(/*some params here*/);
Set<User> users = mySite.getUsers();
//the change here
if(users == null) { user = new HashSet<User>();}

users.add(newUser);
mySite.setUsers(users);

顺便说一句,这是一种不好的做法,mySite.getUsers();会产生创建空列表的行为。

于 2013-11-08T15:22:48.673 回答
1

mySite.users 不为空,为空。确保正确初始化它。

public class Site {

   private Set<User> users = new HashSet<User>();

   public Set<User> getUsers() {
     return users;
   }

   ...

}
于 2013-11-08T15:23:44.593 回答