因此,我有一个名为MainControl的类,该类是从另一个类(主要的类)运行的,我确信它只能运行一次。在MainControl内部,我需要加载一些东西,其中之一是一个函数,该函数使用设置为keybind(int)的键和设置为包含特定keybinds函数的信息的类的值填充HashMap。 (KeyDetails)。
因此,要填充哈希图,它需要经过2个循环,第一个循环是遍历函数列表,第二个循环是检查键是否应绑定到函数。如果第二个循环发现它应该绑定,它将运行Keybinds.put(KeyCode,new Details(Function,KeyCode,KeyName,false);(只需忽略false)。
由于某种原因,它最终会强制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;
}
最佳答案
您的Details
类是-MainControl
;这是一个子类。
扩展类时,子类的构造函数将调用父对象的no-arg构造函数,这将导致无限递归。
编辑以从以下注释中添加:您的“违规行”为:
Keybinds.put(KeyVal, new Details(FunctionStringList[i], KeyVal, Key, false));
当
Details
构造函数执行时,它将调用MainControl()
...,然后调用LoadSession()
...,然后创建一个新的Details
...,然后再调用MainControl()
..等,依此类推。无限递归直到出现堆栈溢出。