【问题标题】:How to avoid array index out of bounds exception when using JSONObject's has function使用 JSONObject 的 has 函数时如何避免数组索引越界异常
【发布时间】:2014-06-10 08:20:53
【问题描述】:

我正在开发一个使用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

提前感谢您的帮助。

【问题讨论】:

  • 日志中的索引为负数,因此您应该首先检查索引是如何设置的。另外,用 JSONLint 格式化你的 JSON 并分享,这些截图不是很可读。

标签: java android json socket.io


【解决方案1】:

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

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

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


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

也许更好的选择是使用ConcurrentHashMap 而不是JSONObject

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2013-10-05
    • 2015-01-31
    • 1970-01-01
    • 2019-06-09
    • 2013-03-01
    • 1970-01-01
    • 2016-08-03
    • 2016-01-04
    相关资源
    最近更新 更多