首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NullPointer从MongoDB获取列表并将其插入数组列表时

NullPointer从MongoDB获取列表并将其插入数组列表时
EN

Stack Overflow用户
提问于 2016-01-23 23:04:40
回答 2查看 112关注 0票数 0

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

代码语言:javascript
复制
 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项

代码语言:javascript
复制
 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
        }

此方法从该特定用户中提取所有数据,并将其插入比较器。

MongoToMap法

代码语言:javascript
复制
public static void MongoTOMap(UUID uuid){
    String trim = uuid.toString().replace("-", "");
    String nontrim = uuid.toString();
    Account ac = new Account();
    DBObject r = new BasicDBObject("uuid", nontrim);
    DBObject found = Mongo.users.findOne(r);

    if ( found != null ){
        ac.setID((String) found.get("_id"));
        ac.setUUID((String) found.get("trimuuid"));
        ac.setName((String) found.get("name"));
        ac.setKingdom((String) found.get("Kingdom"));
        ac.setRecruit((String) found.get("recruit"));
        ac.setCrystals((int) found.get("crystals"));
        ac.setCoins((int) found.get("coins"));
        ac.setRank((String) found.get("rank"));
        ac.setFavor((int) found.get("favor"));
        ac.setJoinDate((String) found.get("First_Join_Date"));
        ac.setLastOnline((String) found.get("Last_Join_Date"));
        ac.addPlayTime((int) found.get("Playtime"));
        ac.setLevel((int) found.get("Network_Level"));
        ac.setExp((int) found.get("Network_Exp"));
        ac.addMultiplier((List) found.get("Multipliers"));
        ac.addFriend((List) found.get("friends"));
        ac.addAchievement((List) found.get("achievements"));
        ac.addPet((List) found.get("pets"));
        ac.addGadget((List) found.get("gadgets"));
        ac.addParticle((List) found.get("particles"));
        ac.addCloak((List) found.get("cloaking"));
        ac.addClothes((List) found.get("clothing"));

        ac.newAccount();
        System.out.println("[Mongo]- Converted user `" + UtilMap.account.get(trim).getName() + "` data to Map, Method/MongoTOMap #" + UtilMath.genReceipt());
    } else {
        //this error should NEVER occur
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-23 23:40:36

您可能需要使用帐户的“长”构造函数:

代码语言:javascript
复制
if (found != null) {
    Account ac = new Account(
        (String) found.get("_id"),
        (String) found.get("trimuuid"),
        ... ,
        (List) found.get("Multipliers"),
        ...
    );
    ac.newAccount();
}

或变更帐户:

代码语言:javascript
复制
public void addMultiplier(List<String> multipliers) {
    if (this.multipliers != null) {
        this.multipliers.addAll(multipliers);
    } else {
        this.multipliers = multipliers;
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-01-23 23:44:53

您正在声明变量multipliers,但从未初始化它。

在这种情况下,变量有一个空值,除非您将一个有效的List<String>传递给您的Account构造函数,但是您的代码只使用默认构造函数(new Account()),因此列表保持为空。

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

要找出异常的原因,可以调试应用程序,也可以添加这样的日志记录:

代码语言:javascript
复制
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); 
}

编辑:哦,我太慢了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34970031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档