【问题标题】:Changing a variable in an Object from an ArrayList<Object>从 ArrayList<Object> 更改对象中的变量
【发布时间】:2013-08-05 18:37:13
【问题描述】:

我目前正在尝试基于 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 类的蛇头实例中的 xCoordinate 变量。

看另一个问题:Edit variables from object in ArrayList?

它建议使用设置器,我已经厌倦了这个但是我仍然得到空点异常错误。

注意:Thread2 是独立于 Swing U.I 的 gameLoop 线程,该寻路方法所在的类是同一线程的一部分。

我在这里错过了什么?

【问题讨论】:

  • 错误似乎snakeHead为空
  • 这意味着snakeHeadNullPointerException 发生时是null。调试你的代码,找出它为什么是null

标签: java object arraylist coordinates path-finding


【解决方案1】:

如果您在snakeHead.xCoordinate = (int) xHead; 行收到空指针错误,这意味着snakeHeadnull,请检查null 是否被传递到方法中。 如果您想知道为什么 openNodes.add(snakeHead); 不会出现空指针错误,那是因为 null 可以添加到某些 java 集合中,它们不会都尝试对您传递给它们的内容执行任何操作(那些可能会调用hashCode()equals()compare(),具体取决于集合类型及其实现)。

当您在方法之间传递对象并进入集合/数组时,您正在制作浅拷贝(您正在传递对对象的引用),因此您对对象所做的任何更改都将在您传递的所有其他地方可见参考。

对对象进行深拷贝(这样更改不会影响对该对象的其他引用)的唯一方法是复制该对象的每个成员变量(某些类可能会提供执行此操作的克隆方法)。

【讨论】:

  • 我明白了,据我所知,这是一个明显的差距(因为我还是个新手。),因为我正在尝试适应使用 HashMap 而不是 ArrayList 的类似算法(但是我想使用ArrayList 来达到同样的目的)。问题的最后一部分 - 我的对象中有一个 ArrayList,称为邻居(因此是当前 PathNode 的相邻节点)。对于“for(PathNode 邻居:current.neighbors){”行,我再次遇到空点异常,我之前部分的问题是我只做了“Public PathNode snakeHead”而不是“PathNode snakeHead = new PathNode”......但没有为 nei 工作
  • 你确定snakeHead在你使用之前已经被初始化(new PathNode())吗?
  • 另外,如果你对寻路感兴趣,你应该看看 Dijkstras 算法。我还遇到了一种创新的寻路算法,它在某些场景中表现非常好Jump Point Search。我已经用图形搜索/路径查找做了一些代码;)
  • 好吧,snakeHead 的 xCoordinate 现在应该是 300,但我认为现在的问题是尝试初始化、引用或读取内部的“ArrayList neighbor = new ArrayList()” snakeHead 的 Pathnode 类(因此它可以看到 xCoordinates 等)。就寻路代码而言,我正在使用模板来学习,因为我目前适应伪代码的能力很差,所以通过实现/修改现有代码来学习(具有 c 权限)。
  • 您的代码是否足够短,可以放入 pastebin 以便我为您玩一下?不要担心重用和学习其他人的代码,每个人都这样做。只是不要试图在未经许可的情况下将其他人的代码商业化。
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2011-09-02
相关资源
最近更新 更多