2014-02-23 46 views
-2

對於Java而言,我不是很有信心。 我現在有這一段代碼在主要方法下創建項目

public static void main(String[] args) 
{ 
    Map m = new Map(); 
    PlayGame p = new PlayGame(); 
    GameLogic g = new GameLogic(); 

    p.startup(); 
    m.load(); 
    g.player_position(); 
    p.commands(); 


} 
Map m = new Map(); 
GameLogic g = new GameLogic(); 

我的主要方法,但也創造了項目(我認爲是什麼他們的稱呼),使該類能夠從其他類變量來閱讀。 我以前剛剛在所有變量前面使用了'public static',但已經知道這是更好的方法。 然而,當我跑,我得到這個錯誤信息:

Exception in thread "main" java.lang.StackOverflowError 
    at PlayGame.<init>(PlayGame.java:28) 
    at Map.<init>(Map.java:7) 
    at PlayGame.<init>(PlayGame.java:19) 
    at Map.<init>(Map.java:7) 
    at PlayGame.<init>(PlayGame.java:19) 
    at Map.<init>(Map.java:7) 

等等...

我該如何解決這個問題?謝謝你的幫助,非常感謝。 David

+0

'StackOverflowErrors'發生,因爲有太多的回調。可能是無限遞歸調用? – webuster

+1

你將不得不顯示你的'Map'和'GameLogic'類的內容。 – Trein

+0

您是否在Map類中創建了PlayGame對象? – SteveL

回答

0

好像你正在你內部創建一個PlayGame地圖類。每當你創建一個新的PlayerGame對象時,你也會創建一個Map對象,每次創建一個Map對象時,它也會創建一個PlayerGame對象,每當你創建一個PlayeGame o ...你明白了,你處於一個無限循環中。

而不是創建您創建一個新的地圖新PlayerGame對象每次的,通過playerGame對象parrameter到Map類的承包商

public static void main(String[] args) 
{ 

    PlayGame p = new PlayGame(); 
    Map m = new Map(p); 
    GameLogic g = new GameLogic(); 

    p.startup(); 
    m.load(); 
    g.player_position(); 
    p.commands(); 

} 

class Map{ 
    PlayerGame pg; 
    public Map(PlayerGame pg){ 
     this.pg=pg; 
    } 
    ....... 
} 
+0

當我將變量從靜態變爲這種方式時,首先發生了這個問題。我被告知,使用靜態變量來使其他類能夠「讀取」它們可能會起作用,但不是好的編碼。我應該回到這種方式還是有更好的方式,我得到這個工作?感謝您的回覆 – pokeairguy

+0

一個靜態變量只會創建一次(當您第一次調用新的GameObject()時)另一方面,當您創建對象的新實例時,會創建非靜態變量(通過使用新的關鍵字),所以它不難理解爲什麼當你將變量改變爲靜態時,不會發生同樣的死循環。 – SteveL