内存不足错误
Out of Memory Error
我正在尝试在某人赢得或输掉二十一点游戏后重写文件。每次我 运行 游戏获胜时,我都会收到此错误:
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.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.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
。最终你消耗了所有的内存。
您只在声明阶段为 line
变量赋值一次:String line = IO.readLine();
而且它发生在 while
循环之前,在循环中您总是使用相同的第一个 line
而不是用输入文件中的新行重新分配它。
换句话说,while
循环无限运行,或者直到内存耗尽,就像您的情况一样。
您必须在 while 循环范围结束之前添加 line = IO.readLine();
。
我正在尝试在某人赢得或输掉二十一点游戏后重写文件。每次我 运行 游戏获胜时,我都会收到此错误:
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.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.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
。最终你消耗了所有的内存。
您只在声明阶段为 line
变量赋值一次:String line = IO.readLine();
而且它发生在 while
循环之前,在循环中您总是使用相同的第一个 line
而不是用输入文件中的新行重新分配它。
换句话说,while
循环无限运行,或者直到内存耗尽,就像您的情况一样。
您必须在 while 循环范围结束之前添加 line = IO.readLine();
。