Java 从MongoDB获取列表并将其插入arraylist时使用空指针

Java 从MongoDB获取列表并将其插入arraylist时使用空指针,java,mongodb,arraylist,bukkit,Java,Mongodb,Arraylist,Bukkit,因此,现在我正在尝试从MongoDB检索一个表,该表目前只包含1个值。因此,每当我试图从Mongo中提取数据并将其插入包含ArrayList的ArrayList或comparator hashmap时,出于某种奇怪的原因,它会输出一个空指针。我不太清楚为什么它会抛出一个空指针,而表本身甚至不是空的。 错误 Caused by: java.lang.NullPointerException at krimsonlib.account.Account.addMultiplier(Accou

因此,现在我正在尝试从MongoDB检索一个表,该表目前只包含1个值。因此,每当我试图从Mongo中提取数据并将其插入包含ArrayList的ArrayList或comparator hashmap时,出于某种奇怪的原因,它会输出一个空指针。我不太清楚为什么它会抛出一个空指针,而表本身甚至不是空的。 错误

 Caused by: java.lang.NullPointerException
    at krimsonlib.account.Account.addMultiplier(Account.java:538) ~[?:?]
    at krimsonlib.account.AccountManager.MongoTOMap(AccountManager.java:169) ~[?:?]
    at krimsonlib.account.AccountManager.makeProfile(AccountManager.java:61) ~[?:?]
    at krimsonlib.core.join(core.java:37) ~[?:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_66]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_66]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_66]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_66]
    at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.8.7-
    ... 14 more
这是将列表添加到现有列表的比较器方法

第538行

 List<String> multipliers;

//comparator
  public Account(String id, String uuid, String name, String kingdom, String rank, String recruit, String joinDate, String lastOnline, List<String> multipliers, List<String> friends,int favor, int playtime, int crystals, int coins, int networklevel, int networkexp, List<String> achievements, List<String> pets, List<String> gadgets, List<String> particles, List<String> cloaking, List<String> clothing){
        this.id = id;
        this.uuid = uuid;
        this.name = name;
        this.kingdom = kingdom;
        this.rank = rank;
        this.recruit = recruit;
        this.joinDate = joinDate;
        this.lastOnline = lastOnline;
        this.multipliers = multipliers;
        this.friends = friends;
        this.favor = favor;
        this.playTime = playtime;
        this.crystals = crystals;
        this.coins = coins;
        this.networklevel = networklevel;
        this.networkexp = networkexp;
        this.achievements = achievements;
        this.pets = pets;
        this.gadgets = gadgets;
        this.particles = particles;
        this.cloaking = cloaking;
        this.clothing = clothing;
    }


public void newAccount(){
        UtilMap.account.put(uuid, new Account(getID(), getUUID(), getName(), getKingdom(), getRank(), getRecruit(), getJoinDate(), getLastOnline(), getMultipliers(), getFriends(), getFavor(), getPlayTime(), getCrystals(), getCoins(), getLevel(), getExp(), getAchievements(), getPets(), getGadgets(), getParticles(), getCloaking(), getClothing()));
    }
 public void addMultiplier(List<String> multipliers) {
            this.multipliers.addAll(multipliers); // this is line 538
        }
您可能需要使用帐户的“long”构造函数:

if (found != null) {
    Account ac = new Account(
        (String) found.get("_id"),
        (String) found.get("trimuuid"),
        ... ,
        (List) found.get("Multipliers"),
        ...
    );
    ac.newAccount();
}
或更改帐户:

public void addMultiplier(List<String> multipliers) {
    if (this.multipliers != null) {
        this.multipliers.addAll(multipliers);
    } else {
        this.multipliers = multipliers;
    }
}
public void add乘数(列表乘数){
if(this.multipliers!=null){
this.multipliers.addAll(multipliers);
}否则{
这个。乘数=乘数;
}
}

您正在声明变量
乘数,但从未对其进行初始化

在这种情况下,变量的值为null,除非您将有效的
列表
传递给
帐户
构造函数,但您的代码仅使用默认构造函数(
新帐户()
),因此列表保持为null

如果乘法器是有效列表,那么在给定行中出现
NullPointerException
的唯一原因是,您将无效(null)列表传递给
addMultiplier

要找出异常的原因,您可以调试应用程序或添加如下日志记录:

public void addMultiplier(List<String> multipliers) {
    if(this.multipliers == null)
    {
        System.out.println("this.multipliers is not set correctly");
    }
    if(multipliers == null)
    {
        System.out.println("parameter multipliers is not set correctly");
    }
    this.multipliers.addAll(multipliers); 
}
public void add乘数(列表乘数){
if(this.multipliers==null)
{
System.out.println(“this.multipliers未正确设置”);
}
if(乘数==null)
{
System.out.println(“参数乘数设置不正确”);
}
this.multipliers.addAll(multipliers);
}

编辑:哦,我太慢了:)

你初始化了这个。乘法器了吗?因为您在其中添加而不是赋值。您在哪里调用addMultiplier()?你在哪里分配任何列表给这个。乘数?@Gavriel它是通过线程更新的比较器分配的。传递给帐户的“列表乘数”在哪里?@Gavriel它不在那里吗<代码>此。乘数=乘数如果没有,请纠正我`
public void addMultiplier(List<String> multipliers) {
    if(this.multipliers == null)
    {
        System.out.println("this.multipliers is not set correctly");
    }
    if(multipliers == null)
    {
        System.out.println("parameter multipliers is not set correctly");
    }
    this.multipliers.addAll(multipliers); 
}