考虑以下代码
private static boolean noHashClash(JSONArray ja,String hash,long epoch,long
stay)
{
int i,diff,len = ja.length();
String oHash;
JSONObject pjo;
try
{
for(i=0;i < len;i++)
{
pjo = ja.optJSONObject(i);
oHash = pjo.optString("hash","");
if ((null == pjo) || (0 == oHash.length())) continue;
diff = TLSH.totalDiff(hash,oHash,false);
if (Geo.hashBlur > diff)
{
pjo.accumulate("ats",epoch);
pjo.accumulate("stays",stay);
int times = pjo.optInt("times",0);
pjo.put("times",times + 1);
return false;
}
}
return true;
} catch(Exception e)
{
Feedback.recordError(Utils.errorString(e));
return true;
}
}
我在这里做的是将哈希值与JSONArray中对象的哈希值进行比较。如果哈希&#34;匹配&#34;找到(模糊)函数返回false
。在此之前,它会修改匹配的对象 - 行
pjo.accumulate("ats",epoch);
....
pjo.put("times",times + 1);
惠斯特这个编译并正确运行,当我保存然后检索JSONArray时,我发现更改没有卡住。我的理解是Java通过值传递函数参数,其中&#34;值&#34;对象参数是实际对象本身。这意味着我对函数内部的对象属性所做的任何更改都应该坚持下去,而这确实会发生。那么为什么嵌套对象显然在这里被区别对待。我怀疑在我对Java中这些东西是如何工作的理解方面存在差距。我非常感谢能够提供帮助的任何人。
答案 0 :(得分:0)
我有点惊讶的是,读到这个问题的人并没有发现这里的问题。我在这里留下了必要的解释,所以它可以帮助其他遇到这个线程的人。
问题的核心在于我正在修改本地引用到嵌套对象。
pjo = ja[i]
.....
.....
pjo.accumulate(...
要使这些更改成为传递的JSONArray参数的一部分,您还必须执行
ja[i] = pjo;
一旦退出例程,没有它就会丢失更改。 Java似乎有自己独特的处理对象参数的方式,这一点并不明显 - 至少在我的Delphi,C和PHP背景下不是这样。