使用JSONObject时,如何避免数组索引超出范围异常具有功能

时间:2014-06-10 08:20:53

标签: java android json socket.io

我正在开发一个我正在使用Socket.io的android项目。

我从服务器获得了JSONObject(源代码如下所示)。

在这里,我需要检查JSONObject中的密钥以显示UI。如果我的JSONObject有一个特定的密钥,我将继续前进,否则我将使用while循环连续点击服务器。当我得到那个特定的密钥时,我有时会得到array index out of bound exception(这不会每次都发生),其余时间它没有显示任何错误,输出是预期的。请您查看我的源代码并帮助我解决我的错误。

源代码:

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

while(!ca.has("myKey")){
 JSONObject ca = tmp.countActiveChallenge();
}

在socket.class中 我返回一个带有该特定键的jsonobject I'm attaching a screen shot of the logcat error enter image description here

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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

  • 您的应用程序存在竞争条件,这是由于两个线程在没有正确同步的情况下读取/更新HashMap对象而导致的。
  • 正在使用反射来修补HashMap的内部数据结构。
  • 对于该版本的Android,HashMap存在错误。

第一个解释是最有可能的,IMO。我希望tmp.countActiveChallenge()返回对其他线程正在更新的JSONObject的引用。显然,这部分代码没有同步......


我认为使用JSONObject有一个很好的解决方案。您可以做的最好的事情是更改此代码,以及更新地图以在外部进行同步的代码。但这可能会导致争用问题,特别是如果有很多条目。

也许更好的选择是使用ConcurrentHashMap代替JSONObject