Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中导致无限循环的HashMap.put_Java_Loops_Random_Infinite - Fatal编程技术网

在Java中导致无限循环的HashMap.put

在Java中导致无限循环的HashMap.put,java,loops,random,infinite,Java,Loops,Random,Infinite,因此,我有一个名为MainControl的类,它是从另一个类(主类)运行的,我确信它只运行一次。在MainControl内部,我必须加载一些东西,其中一个是一个函数,它用设置为keybind(int)的键和设置为保存特定keybinds函数(KeyDetails)信息的类的值填充HashMap 因此,要填充hashmap,它需要经过2个循环,第一个是循环函数列表,第二个是检查键是否应该绑定到函数。如果第二个循环发现它应该被绑定,它将运行Keybinds.put(KeyCode,newdetail

因此,我有一个名为MainControl的类,它是从另一个类(主类)运行的,我确信它只运行一次。在MainControl内部,我必须加载一些东西,其中一个是一个函数,它用设置为keybind(int)的键和设置为保存特定keybinds函数(KeyDetails)信息的类的值填充HashMap

因此,要填充hashmap,它需要经过2个循环,第一个是循环函数列表,第二个是检查键是否应该绑定到函数。如果第二个循环发现它应该被绑定,它将运行Keybinds.put(KeyCode,newdetails(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"
};

您的
Details
类是-a
MainControl
;它是一个子类

扩展类时,子类的构造函数调用父对象的无参数构造函数,这会导致无限递归

编辑以添加以下评论:您的“冒犯行”是:


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

也许你可以发布一些代码,而不是用自己的话来描述它?没有显示实际代码,这里没有人可以帮助你。@Brian:除了Jon Skeet。类详细信息的定义在哪里?删除包含HashMap.put()的行还删除了使用Details类的唯一一行。这暗示它可能包含问题。要展开@Grilse注释-如果该行上发生了什么,这是因为
Details
类的构造函数导致了它。我猜…您正在实例化另一个
MindControl
对象并导致无穷大e递归。
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;
}
Keybinds.put(KeyVal, new Details(FunctionStringList[i], KeyVal, Key, false));