因此,我有一个名为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() ..等,依此类推。无限递归直到出现堆栈溢出。

08-04 19:40