java从ArrayList更改对象中的变量<Object>
我目前正在尝试为基于网格的游戏创建一种基于a*方法算法的寻路方法。但是,我在操作PathNode类实例中的变量时遇到了一个基本问题:
public void AStarPathfinding(PathNode snakeHead, PathNode foodLocation) {
System.out.println(food.xFood);
System.out.println(food.yFood);
openNodes.add(snakeHead);
int xHead = (int) snakeSegments.get(0);
int yHead = (int) snakeSegments.get(1);
snakeHead.xCoordinate = (int) xHead;
snakeHead.yCoordinate = (int) yHead;
foodLocation.xCoordinate = (int) food.xFood;
foodLocation.yCoordinate = (int) food.yFood;
但是,我收到空点异常错误:
Exception in thread "Thread-2" java.lang.NullPointerException
at ArtificialSnake.AStarPathfinding(ArtificialSnake.java:136)
这是哪一行:
snakeHead.xCoordinate = (int) xHead;
想法是将startNode(蛇头)设置为当前蛇头的位置。。。。但是如上所述,我无法确定如何修改PathNode类的snakeHead实例中的xCoordinate变量
看另一个问题:Edit variables from object in ArrayList?
它建议使用setter,我已经厌倦了这一点,但是仍然会出现空点异常错误
注意:Thread2是独立于Swing U.I的gameLoop线程,这个寻路方法所在的类是同一线程的一部分
我错过了什么
# 1 楼答案
如果在
snakeHead.xCoordinate = (int) xHead;
行上收到空指针错误,这意味着snakeHead
是null
,请检查null
是否未传递到方法中。 如果您想知道为什么空指针错误不会在openNodes.add(snakeHead);
发生,这是因为null
可以添加到一些java集合中,那么它们都不会尝试对您传递给它们的内容执行任何操作(执行操作的可能会调用hashCode()
、equals()
或compare()
,具体取决于集合类型及其实现)当您在方法之间传递对象并将其传递到集合/数组中时,您正在创建浅层副本(您正在传递对对象的引用),因此您对对象所做的任何更改都将在传递引用的每个其他位置可见
对对象进行深度复制(以便更改不会影响对该对象的其他引用)的唯一方法是复制该对象的每个成员变量(某些类可能提供执行此操作的克隆方法)