Xmpp Smack在花名册中抛出NullPointerException';s状态监听器

Xmpp Smack在花名册中抛出NullPointerException';s状态监听器,xmpp,smack,Xmpp,Smack,我在android聊天应用程序中使用Smack,最近我将Smack更新为4.3.0版本,并且在fabric中出现了一些错误。它是Smack内部的NullPointerException: Fatal Exception: java.lang.NullPointerException Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference java.util.conc

我在android聊天应用程序中使用Smack,最近我将Smack更新为4.3.0版本,并且在fabric中出现了一些错误。它是Smack内部的
NullPointerException

Fatal Exception: java.lang.NullPointerException
Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference
java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:772)
org.jivesoftware.smack.roster.Roster.getPresencesInternal (Roster.java:374)
org.jivesoftware.smack.roster.Roster.getOrCreatePresencesInternal (Roster.java:388)
org.jivesoftware.smack.roster.Roster.access$1100 (Roster.java:94)
org.jivesoftware.smack.roster.Roster$PresencePacketListener$1.run (Roster.java:1502)
org.jivesoftware.smack.AsyncButOrdered$Handler.run (AsyncButOrdered.java:121)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1113)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:588)
java.lang.Thread.run (Thread.java:818)
“使用源代码,卢克(并研究相关的开放标准)”欧比-万·克诺比

Smack是开源的,所以让我们看看源代码:一个有趣的部分是

org.jivesoftware.smack.lotister.lotister.getPresencesInternal(lotister.java:374)

上面写着

Map<Resourcepart, Presence> entityPresences = presenceMap.get(entity);
userPresences = getOrCreatePresencesInternal(key);
资料来源:

因此,它是一个与stacktrace匹配的
ConcurrentHashMap
。显然,上面的
实体
,这是导致
空点异常
的原因

现在,我们需要向上(或向下,取决于您的观点)遍历调用堆栈,以确定
实体
的来源。有趣的是

org.jivesoftware.smack.花名册$PresencePacketListener$1.run(花名册.java:1502)

上面写着

Map<Resourcepart, Presence> entityPresences = presenceMap.get(entity);
userPresences = getOrCreatePresencesInternal(key);
资料来源:

所以
enitty
就是这里的
key
。这就是声明和定义上面的几行

final BareJid key = from != null ? from.asBareJid() : null;
资料来源:

因此,如果from中的
null,则
也将为null。这会导致
NullPointerException
。查看代码,我们发现这是由于XMPP节中没有
from`属性集而导致的

现在的问题是这些诗节在XMPP中是否合法。要确定这一点,我们需要看一下规范。相关部分为[RFC 6120§8.1.2.1 4.],其中规定

当服务器从服务器生成要传递的节时 代表连接客户的账户向客户发送 (例如,在客户提供数据存储服务的情况下 服务器(代表客户机),节必须(a)不是 包含“发件人”属性或(b)包含“发件人”属性 其值是帐户的裸JID()

因此,通常允许缺少“from”属性,该属性等于“帐户的裸JID”

现在的问题是:是否有从服务器发送到客户端的指定状态节没有“from”属性?我在阅读相关文章时找不到。我不知道什么时候会发生这种情况(我可能会错过一些东西)。但现在这似乎是创建这些状态节的实体中的一个bug,这是使用过的XMPP服务器实现


(您使用的是什么XMPP服务器实现?。

为了更好地理解,您可以发布您的代码吗?它可能重复,而不是关于java空指针异常。它在smack库崩溃。
它不是关于java空指针异常的
然后你的logcat在告诉你谎言…嗨@Flow,谢谢你的回答,但我知道主要问题来自服务器,它与。