Skip to main content
 首页 » 编程设计

Java程序在覆盖现有的.txt文件时崩溃

2025年12月25日41qq号

我正在制作一个简单的基于文本的游戏,您必须在其中键入命令来执行某些操作。我最近在游戏中添加了一项功能,可让您保存进度。但是由于某种原因,如果您尝试将游戏保存在现有的保存文件上,它会崩溃。这是保存游戏的代码( 保存失败时会显示“尝试保存游戏数据时出错。游戏现在将关闭。”如预期的 ):

import java.util.Formatter; 
import javax.swing.JOptionPane; 
 
public class Gamesave { 
    private static Formatter gamesave; 
    private static Formatter firstTimeSave; 
    private static Formatter attackpoints; 
    private static Formatter defensepoints; 
    private static Formatter skillpoints; 
    private static Formatter wins; 
    private static Formatter loses; 
    private static Formatter money; 
    // Attackpoints, defensepoints, skillpoints, wins, loses, money 
    public static void openFile(){ 
        try{ 
            attackpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_attackpoints.txt"); 
            defensepoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_defensepoints.txt"); 
            skillpoints = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_skillpoints.txt"); 
            wins = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_wins.txt"); 
            loses = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_loses.txt"); 
            money = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+"_money.txt"); 
            gamesave = new Formatter("c:\\FightNight\\Saves\\"+MainClass.newProfileName+"\\"+MainClass.newProfileName+".txt"); 
            firstTimeSave = new Formatter("c:\\FightNight\\Game Data\\firstTimeSave.txt"); 
        }catch (Exception e) {JOptionPane.showMessageDialog(null, "There was an error when trying to save game data. The game will now close."); System.exit(0);} 
 
    } 
 
    public static void addRecords(){ 
        attackpoints.format("%s",MainClass.attackpoints); 
        defensepoints.format("%s",MainClass.defensepoints); 
        skillpoints.format("%s",MainClass.skillpoints); 
        wins.format("%s",MainClass.wins); 
        loses.format("%s",MainClass.loses); 
        money.format("%s",MainClass.money); 
        firstTimeSave.format("%b", MainClass.firstTime); 
 
    } 
 
    public void closeFile(){ 
        attackpoints.close(); 
        defensepoints.close(); 
        skillpoints.close(); 
        wins.close(); 
        loses.close(); 
        money.close(); 
        gamesave.close(); 
        firstTimeSave.close(); 
    } 
 
} 

这是调用类的代码:
static class SaveAction implements ActionListener{ 
        public void actionPerformed (ActionEvent e){ 
            try{ 
                Gamesave.openFile(); 
                Gamesave.addRecords(); 
                save.closeFile(); 
                JOptionPane.showMessageDialog(null, "Your game has been saved."); 
            }catch (Exception e1) {JOptionPane.showMessageDialog(null, "Sorry, that is an invalid response.");} 
        } 
    } 

另一个注意事项,当游戏第一次在计算机上启动时,它会为保存文件和其他需要的东西创建目录。 感谢您的任何帮助!

堆栈跟踪:
java.io.FileNotFoundException: c:\FightNight\Saves\null\null_attackpoints.txt (The system cannot find the path specified) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(Unknown Source) 
    at java.io.FileOutputStream.<init>(Unknown Source) 
    at java.util.Formatter.<init>(Unknown Source) 
    at Gamesave.openFile(Gamesave.java:16) 
    at CommandLine$SaveAction.actionPerformed(CommandLine.java:93) 
    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$000(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.awt.EventQueue$3.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.awt.EventQueue$4.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

请您参考如下方法:

看来你所有的GameSave方法是静态的,除了 closeFile方法。然而,所有引用相同的字段。尝试制作 closeFile静止的。毕竟它似乎引用了静态字段。

当然,也可以像其他方法一样调用它,例如:GameSave.closeFile ,而不是 someInstanceOfGameSave.closeFile .

最后,如果这不起作用,添加行 e.printStackTrace();在显示您的消息对话框并将生成的堆栈跟踪打印为您的问题的编辑之前。

编辑

确保检查 closeFile 中的空值。方法也是。