Xmpp Smack在花名册中抛出NullPointerException';s状态监听器
我在android聊天应用程序中使用Smack,最近我将Smack更新为4.3.0版本,并且在fabric中出现了一些错误。它是Smack内部的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
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,谢谢你的回答,但我知道主要问题来自服务器,它与。