首页 > 解决方案 > 无法在迭代器中引用以前使用的元素(java)

问题描述

当我使用迭代器遍历条目集的元素时,我无法引用之前已经迭代过的元素。这是更具体的问题:

public void adjSetter(HashMap<ArrayList<Integer>,miniSquare> mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        System.out.println("Hi~!");

        Map.Entry pair = (Map.Entry)it.next();
        ArrayList<Integer> lis=(ArrayList<Integer>)pair.getKey();
        System.out.println(lis.get(0) + "  " + lis.get(1) + "Yerr");
        miniSquare minSqua=(miniSquare)pair.getValue();
        if((minSqua.yCord!=600)){
            lis.set(1,minSqua.yCord+50);
            minSqua.topSquare=mp.get(lis);
             System.out.println("This Square is " + minSqua.xCord + "  " +minSqua.yCord + " and its top square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.topSquare.xCord + " " + minSqua.topSquare.yCord  ); }
        if(minSqua.yCord!=250){
            lis.set(1,minSqua.yCord-50);
            minSqua.bottomSquare=mp.get(lis);
            System.out.println("This Square is " + minSqua.xCord + "  " + minSqua.yCord + " and its bottom square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.bottomSquare.xCord + " " + minSqua.bottomSquare.yCord );
            }
        if(minSqua.xCord!=550){
            lis.set(1,minSqua.yCord);
            lis.set(0,minSqua.xCord+50);
            minSqua.rightSquare=mp.get(lis);
            System.out.println("This Square is " + minSqua.xCord + "  " + minSqua.yCord + " and its right square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.rightSquare.xCord + " " + minSqua.rightSquare.yCord );
        lis.set(0,450); lis.set(1,450); //The error line
            System.out.println(mp.get(lis).xCord+ "Yerd");}
        if(minSqua.xCord!=200){
            lis.set(1,minSqua.yCord);
            lis.set(0,minSqua.xCord-50);
            minSqua.leftSquare=mp.get(lis);
            System.out.println("This Square is " + minSqua.xCord + "  " + minSqua.yCord + " and its left square is " + lis.get(0) + " " + lis.get(1) + " And it's actually " + minSqua.leftSquare.xCord + " " + minSqua.leftSquare.yCord );// This line throws a null pointer exception if the other problem line is deleted 
        }

    }

}

使用键 (450,450) 遍历元素后,该行

lis.set(0,450); lis.set(1,450);

产生一个空指针异常。任何人都可以帮助了解如何解决这个问题,甚至问题到底是什么?如果信息不足或代码难以阅读,我很抱歉。

标签: javanullpointerexceptionhashmapiterator

解决方案


我不确定你得到的确切原因NullPointerException,但你在滥用HashMap。即使您没有在迭代 的条目的中间HashMap,改变MapArrayList<Integer>在您的情况下为 an )的键也会破坏HashMap,因为它会更改hashCode()已经在 中Map的键的一个与其新的不匹配的存储桶hashCode())。

这可能会破坏迭代器代码并导致NullPointerException. 你不应该改变 a 的键HashMap。如果您没有对条目进行迭代,则可以从 中删除条目Map,改变键,然后将其放回 中Map,但是在迭代 . 时不允许这样做Map

PS,而不是使用原始Iteratorand Map.Entry,这需要稍后进行转换,使用:

Iterator<Map.Entry<ArrayList<Integer>,miniSquare>> it = mp.entrySet().iterator();

Map.Entry<ArrayList<Integer>,miniSquare> pair = it.next();

这不会解决您的异常,但这是一种很好的做法。


推荐阅读