2012-04-28 88 views
3

所以我有一個名爲MainControl的類從另一個類(主要的)運行,我確定只運行一次。 MainControl內部我有幾件事情必須加載,其中之一是一個函數,該函數使用設置爲keybind(int)的密鑰填充HashMap,並將值設置爲保存特定keybinds函數信息的類(KeyDetails)。HashMap.put在Java中導致無限循環

所以要填充散列圖,它會經歷2個循環,第一個循環遍歷函數列表,第二個循環遍歷函數列表,第二個檢查鍵是否應該綁定到函數。如果第二個循環發現它應該被綁定,它將運行Keybinds.put(KeyCode,新的細節(函數,KeyCode,KeyName,假);(只是忽略該假)

由於某種原因它最終強制MainControl ();當它到達Keybinds.put時再次運行...沒有任何理由,沒有任何函數可以使MainControl運行,並且它在我刪除Keybinds.put行時起作用,只需刪除那條單行作品

public MainControl() 
{ 
    System.out.println("Starting System"); 
    LoadSession("Default"); 
    System.out.println("Ended System - Never Reached"); 
} 

public static void LoadSession(String s) 
{ 
    Keybinds = new HashMap(); 

    for (int i = 0; i < FunctionStringList.length; i++) 
    { 
     String Key = ""; 
     int KeyVal = 0; 

     try 
     {       
      for (int a = 0; a < KeyBindingList.length; a++) 
      { 
       if (KeyBindingList[a].KeyName.equalsIgnoreCase(FunctionStringList[i])) 
       { 
        Key = KeyBindingList[a].KeyName 
        KeyVal = KeyBindingList[a].KeyCode 
       } 
      }    


      Keybinds.put(KeyVal, new Details(FunctionStringList[i], KeyVal, Key, false)); 

      System.out.println("Key: " + Key + " Val: " + KeyVal + " Hack: " + FunctionStringList[i]);  
     } 
     catch (Exception E) { E.printStackTrace(); }   
    } 
} 

public static String FunctionStringList[] = 
{ 
    "Forward", "Backwards", "StrafeLeft", "StrafeRight", "Jump", "Sneak" 
}; 

詳細類別:

public class Details extends MainControl 
{ 
public Details(String Name, int KeyCode, String KeyName2, boolean Bool) 
{  
    FunctionName = Name; 
    Code = KeyCode; 
    KeyName = KeyName2 != null ? KeyName2 : "None"; 
    State = Bool; 
} 

public boolean Toggle() 
{ 
    State = !State; 
    return State; 
} 

public void SendChat(String s) 
{ 
    Console.AddChat(s); 
} 

public String FunctionName; 
public String KeyName; 
public int Code; 
public boolean State; 
} 
+7

也許你可以發佈一些你的代碼,而不是用你自己的話來描述它? – 2012-04-28 23:27:35

+1

沒有顯示你的*實際*代碼,這裏沒有人可以幫助你。 – 2012-04-28 23:27:49

+5

@Brian:除了Jon Skeet。 – 2012-04-28 23:30:48

回答

2

Details class is-aMainControl;這是一個子類。

當您擴展一個類時,子類的構造函數正在調用父對象的無參數構造函數,這會導致無限遞歸。

編輯從下面的評論添加:你的「進攻路線」是:

Keybinds.put(KeyVal, new Details(FunctionStringList[i], KeyVal, Key, false)); 

Details構造函數執行,然後調用MainControl() ......然後調用LoadSession() ...然後創建一個新的Details ...然後調用MainControl() ..等,等無限遞歸,直到你得到堆棧溢出。

+0

你是絕對的神,非常感謝你! – 2012-04-29 00:07:02