Java 使用JSONObject的has函数时如何避免数组索引越界异常

Java 使用JSONObject的has函数时如何避免数组索引越界异常,java,android,json,socket.io,Java,Android,Json,Socket.io,我正在做一个android项目,在这个项目中我使用Socket.io 我有一个JSONObject,它是从服务器获得的,源代码如下所示 在这里,我需要检查JSONObject中的键以显示UI。如果我的JSONObject有一个特定的键,我将继续,否则我将使用while循环不断地访问服务器。当我得到那个特定的键时,我有时会得到数组索引越界异常。这并不是每次都会发生,在其余的时间里,它不会显示任何错误,并且输出如预期的那样。请您检查我的源代码,并帮助我哪里出了问题 源代码: socket tmp =

我正在做一个android项目,在这个项目中我使用Socket.io

我有一个JSONObject,它是从服务器获得的,源代码如下所示

在这里,我需要检查JSONObject中的键以显示UI。如果我的JSONObject有一个特定的键,我将继续,否则我将使用while循环不断地访问服务器。当我得到那个特定的键时,我有时会得到数组索引越界异常。这并不是每次都会发生,在其余的时间里,它不会显示任何错误,并且输出如预期的那样。请您检查我的源代码,并帮助我哪里出了问题

源代码:

socket tmp = new socket();
In Login.class  
JSONObject ca = tmp.countActiveChallenge();

while(!ca.has("myKey")){
 JSONObject ca = tmp.countActiveChallenge();
}
在socket.class中 我返回一个带有特定键的jsonobject


提前感谢您的帮助。

那里发生了一些非常奇怪的事情。HashMap不应该抛出该异常。我能想到的唯一解释是:

应用程序存在争用情况,这是由于两个线程在没有正确同步的情况下读取/更新HashMap对象造成的。 有些东西正在使用反射来修补HashMap的内部数据结构。 该版本Android的HashMap中有一个bug。 第一种解释是最有可能的,IMO。我希望tmp.countActiveChallenge返回对其他线程正在更新的JSONObject的引用。显然,这部分代码没有同步

我认为使用JSONObject没有好的解决方案。您所能做的最好是更改此代码,以及更新映射以进行外部同步的代码。但这很可能会导致争用问题,特别是在条目很多的情况下


也许更好的替代方法是使用ConcurrentHashMap而不是JSONObject。

索引在日志中为负数,因此您应该首先检查如何设置索引。另外,在JSONLint中格式化JSON并共享,这些屏幕截图可读性不强。