繁体   English   中英

为什么这会产生堆OutOfMemory错误?

[英]Why is this producing a heap OutOfMemory error?

for(int i = 0; i < colorOrder.size(); i++)
    {
        String colour = "";
        colour = gui.getUserInputElement(i);
        userColourInput.add(colour);
    }

基本上,我正在创建一个“ simon说”游戏,并且我试图将数据从一个类中保存的arrayList移到另一个类中保存的arrayList中,以便可以操纵数据。 colorOrder和userColourInput是arrayLists,而getUserInputElement()方法如下:

public String getUserInputElement(int index)
    {
        return userInput.get(index);
    }

我收到的错误消息是:

java.lang.OutOfMemoryError:Java堆空间

at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:261)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
at java.util.ArrayList.add(ArrayList.java:458)
at Game.gameLoop(Game.java:87)
at Game.<init>(Game.java:23)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at bluej.runtime.ExecServer$3.run(ExecServer.java:746)

GameLoop如下,不确定需要哪个部分,因此希望在发布整个内容时不会太麻烦。

public void gameLoop()
{
    while(true)
    {
        String input = "";
        boolean userInputFull = false;
        int inputSize = 0;

        if(orderPulled == false)
        {
            getColorOrder();
            System.out.println("colorOrder set to order ArrayList");
            userClicks = colorOrder.size();
            System.out.println("User clicks set to " + userClicks);
            orderPulled = true;

        }


        if(flashed == false)
        {
            pause(2000); //taking this out of here and putting in init or in this loop
        }                //causes a freeze, why?



        if(flashed == false)
        {
            for(int i = 0; i < colorOrder.size(); i++)
            {
                gui.flashButton(colorOrder.get(i));
                System.out.println("Flashing " + colorOrder.get(i));
                pause(500);
            }
            gui.changeInstructionCopy();
            flashed = true;
            gui.enableButtons();
            System.out.println("colorOrder size: " + colorOrder.size());

        }

        inputSize = gui.getUserInputSize();

        if(inputSize == colorOrder.size())
        {
            gui.disableButtons();

            for(int i = 0; i < colorOrder.size(); i++)
            {
                String colour = "";
                colour = gui.getUserInputElement(i);
                userColourInput.add(colour);
            }

        }
        else
        {
            gui.enableButtons();
            gui.printUserInputArray();
        }







    }
}

最有可能的是,您永远不会清除userColourInput :在while (true)循环中不断添加和添加元素,直到用完内存为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM