2012-04-28 164 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