迭代器在Java中工作不正常

迭代器在Java中工作不正常,java,json,iterator,Java,Json,Iterator,我的jsonObject中有一个键集合,我需要遍历这个集合。从复制的代码,我的代码是: public static void parseJson(JSONObject jsonObject, String dir) throws ParseException { //Set<Object> set = jsonObject.keySet(); ArrayList<JSONObject> arrays=new ArrayList<JSONObject

我的jsonObject中有一个键集合,我需要遍历这个集合。从复制的代码,我的代码是:

public static void parseJson(JSONObject jsonObject, String dir) throws ParseException {

    //Set<Object> set = jsonObject.keySet();
    ArrayList<JSONObject> arrays=new ArrayList<JSONObject>();
    Iterator<Object> iterator = jsonObject.keys();
    while (iterator.hasNext()) {
        Object obj = iterator.next();
        try {
            if (jsonObject.get((String) obj) instanceof JSONArray) {
                System.out.println(obj.toString());
                getArray(jsonObject.get((String) obj));
            } else {
                if (jsonObject.get((String) obj) instanceof JSONObject) {
                    dir=dir+(String)obj+"/";
                    parseJson((JSONObject) jsonObject.get((String) obj),dir);
                    dir=dir.replace((String)obj+"/","");
                } else {
                    String path=dir+obj.toString();
                    System.out.println(obj.toString() + "\t"
                            + jsonObject.get((String) obj));
                }
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
publicstaticvoidparsejson(jsonobjectjsonobject,stringdir)抛出ParseException{
//Set=jsonObject.keySet();
ArrayList数组=新的ArrayList();
迭代器迭代器=jsonObject.keys();
while(iterator.hasNext()){
Object obj=iterator.next();
试一试{
if(jsonObject.get((String)obj)instanceof JSONArray){
System.out.println(obj.toString());
getArray(jsonObject.get((String)obj));
}否则{
if(jsonObject.get((字符串)obj)jsonObject实例){
dir=dir+(字符串)obj+“/”;
parseJson((JSONObject)JSONObject.get((String)obj),dir);
dir=dir.replace((字符串)obj+“/”,“”);
}否则{
字符串路径=dir+obj.toString();
System.out.println(obj.toString()+“\t”
+get((String)obj));
}
}
}捕获(JSONException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
在执行第一行代码后,它向我显示了4的集合(这是正确的),但“LastEntryreturned”指向最后一个键,“next()”指向null,因此在第二行代码后,它结束循环并返回结果,而不迭代集合

这段代码在两天前运行良好,但我不知道现在发生了什么。请帮帮我,我已经在这上面花了太多时间了。。。

由于问题没有明确定义,我将尝试列出脑海中出现的几种可能性,假设您在调试时看到此问题:

  • 您正在调试器中计算
    next()
    ,导致迭代器在代码之外向前移动

  • 在方法的开头附近有一个断点。如果使用嵌套的JSON对象递归调用该方法,则第二次遇到断点时,元素的数量可能会减少

  • 您看到“last”JSON字段的时间比预期的要早,因为JSON解析器没有维护输入字符串中字段的顺序


  • 请提供更多代码。我们需要更多详细信息。您观察到的哪些具体行为使您相信该循环已被跳过?您是否在调试器中分析执行情况?你真的对循环中的键做了什么吗?是的,如果没有太多的代码,读者会觉得很难理解undertand@drewmoreLastEntryReturned()是迭代器的默认函数,它显示当前的后指针。@shmosel Question updated我在函数的开头设置了一个breakpiont,所以它不可能第一次不命中,我不是说它没有命中第一个断点,而是说在它命中后,你点击了“continue”。当你们点击那个断点时,你们看到了什么?当我的断点第一次被点击时,迭代器已经进入最后一个或第二个最后一个索引,解释你们所说的“最后一个索引”是什么意思。迭代器没有索引。迭代器不必按表索引的顺序移动。我怀疑您不是在想象问题,就是忽略了问题,因为您过于关注
    HashMap
    的实现细节。您可以放心,Java的
    HashMap
    做了它应该做的事情。如果在某个地方有问题,可能是我在回答中提出的误解,也可能是
    parseJson
    中存在错误。