java - 无法在迭代器中引用以前使用的元素(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);
产生一个空指针异常。任何人都可以帮助了解如何解决这个问题,甚至问题到底是什么?如果信息不足或代码难以阅读,我很抱歉。
解决方案
我不确定你得到的确切原因NullPointerException
,但你在滥用HashMap
。即使您没有在迭代 的条目的中间HashMap
,改变Map
(ArrayList<Integer>
在您的情况下为 an )的键也会破坏HashMap
,因为它会更改hashCode()
已经在 中Map
的键的一个与其新的不匹配的存储桶hashCode()
)。
这可能会破坏迭代器代码并导致NullPointerException
. 你不应该改变 a 的键HashMap
。如果您没有对条目进行迭代,则可以从 中删除条目Map
,改变键,然后将其放回 中Map
,但是在迭代 . 时不允许这样做Map
。
PS,而不是使用原始Iterator
and Map.Entry
,这需要稍后进行转换,使用:
Iterator<Map.Entry<ArrayList<Integer>,miniSquare>> it = mp.entrySet().iterator();
和
Map.Entry<ArrayList<Integer>,miniSquare> pair = it.next();
这不会解决您的异常,但这是一种很好的做法。
推荐阅读
- javascript - 每个 then() 都应该返回一个值或抛出 Firebase 云函数
- php - Laravel Blade OneToOne 未定义属性
- css - React 如何影响 CSS?
- postgresql - PostgreSQL:比较两组结果不起作用
- c# - 在 Visual Studio 2015 中添加新内容
- haskell - 在haskell中接受/拒绝下推自动机
- database - 在 Postgresql 中插入、更新索引上的查询
- c# - 即使在 PictureBox 上绘制之后,pictureBox1.Image 仍为空
- wordpress - wordpress rest api send empty json file
- php - filter JSON by object property and return entire object