Не может ссылаться на ранее использованные элементы в итераторе (Java) - PullRequest
0 голосов
/ 13 ноября 2018

Когда я использую итератор для просмотра элементов набора записей, я не могу ссылаться на элементы, которые ранее были повторены. Вот более конкретная проблема:

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);

возвращает исключение нулевого указателя. Может кто-нибудь помочь понять, как это исправить, или даже в чем проблема на самом деле? Извините, если недостаточно информации, как есть, или код трудно прочитать.

1 Ответ

0 голосов
/ 13 ноября 2018

Я не уверен в точной причине, по которой вы получили NullPointerException, но вы неправильно используете HashMap.Даже если вы не выполняли итерацию по записям HashMap, изменение ключа Map (в вашем случае ArrayList<Integer>) ломает HashMap, так как оно меняет hashCode()ключа уже в Map (что означает, что ключ может храниться в сегменте, который не соответствует его новому hashCode()).

Это, вероятно, сломало код итератора и вызвало NullPointerException,Вы не должны мутировать ключи HashMap.Если вы не перебираете записи, вы могли бы удалить запись из Map, преобразовать ключ в ключ и вернуть ее обратно в Map, но это не разрешено при переборе Map.

PS, вместо использования необработанных Iterator и Map.Entry, которые требуют приведения позже, используйте:

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

и

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

Это не решит вашу проблемуисключение, но это хорошая практика.

...