3

したがって、別のクラス (メインのクラス) から実行される MainControl という名前のクラスがあり、これは 1 回だけ実行されると確信しています。MainControl の内部には、ロードする必要があるものがいくつかあります。そのうちの 1 つは、キーバインド (int) に設定されたキーと、特定のキーバインド関数の情報を保持するクラスに設定された値を HashMap に設定する関数です。 (キーの詳細)。

したがって、ハッシュマップにデータを入力するには、2 つのループを通過します。1 つ目は関数のリストをループし、2 つ目はキーを関数にバインドする必要があるかどうかを確認します。2 番目のループでバインドする必要があることが判明した場合は、Keybinds.put(KeyCode, new Details(Function, KeyCode, KeyName, false); (false は無視してください) が実行されます。

何らかの理由で MainControl(); を強制することになります。Keybinds.put... に到達したら、理由もなく再度実行します。MainControl を実行させる関数はなく、Keybinds.put 行を削除すると機能します。その1行を削除するだけで機能します。

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クラス MainControl-aです。それはサブクラスです。

クラスを拡張すると、子クラスのコンストラクターが親オブジェクトの引数のないコンストラクターを呼び出し、無限再帰が発生します。

以下のコメントから追加するように編集します。あなたの「問題のある行」は次のとおりです。

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

Detailsコンストラクターが実行されると、...MainControl()が呼び出され、... が呼び出されて ... が呼び出さLoadSession()れ、新しいDetails... が作成され、 MainControl().. などが呼び出されます。スタック オーバーフローが発生するまで無限に再帰します。

于 2012-04-29T00:02:59.697 に答える