我目前正在尝试基于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(snakeHead)设置为当前蛇头的位置....但如上所述,我无法解决如何修改PathNode类的snakeHead实例中的xCoordinate变量。
查看另一个问题:Edit variables from object in ArrayList?
它建议使用setter,我已经厌倦了这个但是我仍然得到零点异常错误。
注意:Thread2是与Swing U.I分开的gameLoop线程,此路径查找方法所在的类是同一线程的一部分。
我在这里缺少什么?
答案 0 :(得分:0)
如果您在行snakeHead.xCoordinate = (int) xHead;
上收到空指针错误,则表示snakeHead
为null
,请检查null
是否未传递给该方法。
如果您想知道为什么在openNodes.add(snakeHead);
没有出现空指针错误,那是因为null
可以添加到某些java集合中,它们并不都会尝试对传递给它们的内容执行任何操作(那些可能会根据集合类型及其实现情况调用hashCode()
,equals()
或compare()
。
当您在方法之间传递对象并进入集合/数组时,您正在制作浅层副本(您正在传递对该对象的引用),因此您对该对象所做的任何更改都将在您传递给该对象的每个其他位置都可见参考
制作对象的深层副本(以便更改不会影响对象的其他引用)的唯一方法是复制对象的每个成员变量(某些类可能提供执行此操作的克隆方法)。