2013-08-05 45 views
0

我目前正在嘗試爲基於A *方法算法的基於網格的遊戲創建路徑查找方法。但是我有一個基本的問題,我PathNode類實例中操作變量:從ArrayList中更改對象中的變量<Object>

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)設置爲當前蛇頭的位置....但如上面所建議的,我無法弄清楚如何修改snakeHead insta中的xCoordinate變量PathNode類的nce。

看着另一個問題:Edit variables from object in ArrayList?

它建議使用制定者,我已經厭倦了這個,但是我仍然得到零點異常錯誤。

注意:Thread2是與Swing U.I分開的gameLoop線程,該尋路方法所在的類是同一線程的一部分。

我在這裏錯過了什麼?

+0

錯誤似乎'snakeHead'爲空 –

+0

這意味着'NullPointerException'發生時'snakeHead'爲'null'。調試你的代碼,找出它爲什麼是'空'。 – Jesper

回答

0

如果您收到上線snakeHead.xCoordinate = (int) xHead;空指針錯誤,這意味着snakeHeadnull,檢查null沒有被傳遞到方法。 如果你奇怪爲什麼在openNodes.add(snakeHead);沒有發生空指針錯誤,這是因爲null可以添加到一些Java集合,他們並不都試圖對你傳遞給它們的任何操作(那些可能會調用hashCode()equals()compare(),具體取決於集合類型及其實現)。

當您在方法之間傳遞對象並傳入集合/數組時,您正在製作淺拷貝(您正在傳遞對該對象的引用),因此對該對象所做的任何更改都會在您傳遞的其他每個位置都可見參考資料。

使對象的深層副本(以便更改不影響其他對象的引用)的唯一方法是複製對象的每個成員變量(某些類可能會提供一個克隆方法來執行此操作) 。

+0

我看到,這是一個明顯的差距(因爲我還很新。)在我的知識,因爲我試圖適應類似alogrithm使用HashMap而不是ArrayList(但我想用ArrayList實現相同的目標) 。問題的最後一部分 - 我的對象中有一個名爲neighbors的ArrayList(所以與當前PathNode相鄰的節點)。 「(PathNode neighbor:current.neighbors){」我的問題與以前的部分是我只做「公共PathNode snakeHead」而不是「PathNode snakeHead = new PathNode」......但沒有爲nei工作 –

+0

在使用之前,你確定'snakeHead'正在被初始化('New PathNode()')嗎? – Robadob

+0

另外,如果你對路徑尋找感興趣,你應該看看Dijkstras算法。我還遇到了一種創新的路徑查找算法,在某些場景[跳轉點搜索](http://harablog.wordpress.com/2011/09/07/jump-point-search/)中表現得非常好。我已經用圖搜索/路徑查找完成了一些代碼;) – Robadob

相關問題