Java 内存不足错误

Java 内存不足错误,java,file-io,out-of-memory,heap-memory,overwrite,Java,File Io,Out Of Memory,Heap Memory,Overwrite,我试图在某人赢了或输了21点游戏后重写一个文件。每次我运行游戏并获胜时,都会出现以下错误: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Unknown Source) at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)

我试图在某人赢了或输了21点游戏后重写一个文件。每次我运行游戏并获胜时,都会出现以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Unknown Source)
    at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
    at java.lang.AbstractStringBuilder.append(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at User.setWinnings(User.java:278)
    at Blackjack.addWinnings(Blackjack.java:182)
    at Blackjack.showWinMessage(Blackjack.java:323)
    at Blackjack.showOutcome(Blackjack.java:308)
    at Blackjack.actionPerformed(Blackjack.java:401)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
这是setWinnings方法的代码

public void setWinnings(int winnings2) {
    winnings = winnings2;

    IO.openInputFile("users.txt");
    String line = IO.readLine();
    StringBuilder newFile = new StringBuilder();

    while(line != null){
        String tokens[] = line.split("%");

        if(tokens.length > 0){

            if(tokens[0].equalsIgnoreCase(this.getUserID())){
                String newLine = tokens[0] + tokens[1]+ tokens[2] + winnings2 + tokens[4]+ tokens[5]+ tokens[6];

                newFile.append(newLine);
                newFile.append("\n");
            } else {
                newFile.append(line);
                newFile.append("\n");
            }

        }
    }

    IO.closeInputFile();
    IO.createOutputFile("users.txt");
    IO.println(newFile.toString());
    IO.closeOutputFile();

}
我已经尝试进入控制面板,并将java下调用的任何字段更改为-Xms2048m或其他内容。你知道为什么这行不通吗

编辑:注意users.txt的大小只有82字节。

您有一个循环

while(line != null) { 
    ...
}
但在循环中,你再也看不到另一行了。循环从未终止,您一直将相同的数据附加到
newFile
。最终你会消耗掉所有的内存。

你有一个循环

while(line != null) { 
    ...
}

但在循环中,你再也看不到另一行了。循环从未终止,您一直将相同的数据附加到
newFile
。最终,您将消耗所有内存。

在声明阶段,只为
变量赋值一次:
String line=IO.readLine()
和sin'ceit发生在
while
循环之前,在循环中,您始终使用相同的第一行
而不使用输入文件中的新行重新分配它

换句话说,
while
循环无限运行,或者直到内存耗尽,就像您的情况一样


您必须添加
line=IO.readLine()正好在while循环作用域结束之前。

在声明阶段,您只为
变量赋值一次:
String line=IO.readLine()
和sin'ceit发生在
while
循环之前,在循环中,您始终使用相同的第一行
而不使用输入文件中的新行重新分配它

换句话说,
while
循环无限运行,或者直到内存耗尽,就像您的情况一样


您必须添加
line=IO.readLine()就在while循环作用域结束之前。

Brb kms。。。多么愚蠢的错误啊。我将尝试添加新的readline语句BRB kms。。。多么愚蠢的错误啊。我将尝试添加一个新的readline语句可能重复的