3

所以我有一个名为 MainControl 的类,它是从另一个类(主类)运行的,我确信它只运行一次。在 MainControl 内部,我有一些必须加载的东西,其中之一是填充 HashMap 的函数,其中键设置为键绑定 (int),值设置为保存特定键绑定函数信息的类(关键细节)。

因此,要填充哈希图,它需要经过 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;
}
4

1 回答 1

2

你的Details班级是-a MainControl;它是一个子类。

当您扩展一个类时,子类的构造函数正在调用父对象的无参数构造函数,这会导致无限递归。

编辑以从下面的评论中添加:您的“违规行”是:

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

Details构造函数执行时,它会调用MainControl()...,然后调用LoadSession()...,然后创建一个新的Details...,然后调用MainControl()..等,等等。无限递归,直到你得到一个堆栈溢出。

于 2012-04-29T00:02:59.697 回答