You need to enable JavaScript to run this app. Java开发简易RPG游戏时loadGame方法加载多类型存档数据异常求助
优惠活动
大模型
产品
解决方案
定价
更多

Java开发简易RPG游戏时loadGame方法加载多类型存档数据异常求助

问题核心原因
  • 现有loadGame方法没有执行任何实际的存档读取操作:代码中写的player.getHealth()、player.getLevel()、player.equippedItem只是对当前内存中玩家对象的属性做读取动作,既没有调用BufferedReader的readLine()方法从存档文件中获取内容,也没有将读取到的存档值回写到玩家对象上——getter方法仅负责返回对象当前的已有属性值,无法对属性做修改,必须配合setter方法或者直接给公开属性赋值才能更新玩家状态。
  • 存档写入时的格式带有固定说明前缀(例如health行的内容是Your health is 数值、level行的内容是Your level is 数值),并非纯裸存储的有效数据,读取时需要先剥离前缀、提取出有效数值,再做类型转换后才能赋值给对应属性。
  • 原代码打开文件流后没有做任何内容读取就直接关闭,全程没有从存档文件中拿到任何数据,自然无法更新玩家状态。
可正常运行的修正实现

优化存档写入逻辑

原saveGame可以调整为更易解析的纯数据写入格式,同时通过try-with-resources实现文件流的自动关闭,避免资源泄漏:

public static void saveGame() {
    // try-with-resources会在代码块执行完后自动关闭BufferedWriter
    try (BufferedWriter bw = new BufferedWriter(new FileWriter("savedGame.txt"))) {
        // 直接写入纯数值/纯文本,省去解析时拆前缀的步骤
        bw.write(String.valueOf(player.getHealth()));
        bw.newLine();
        bw.write(String.valueOf(player.getLevel()));
        bw.newLine();
        bw.write(player.equippedItem);
    } catch (Exception e) {
        System.out.println("There's an error.");
    }
}

修正加载逻辑

loadGame需要逐行读取存档、做类型转换、回写玩家状态:

public void loadGame() {
    try (BufferedReader br = new BufferedReader(new FileReader("savedGame.txt"))) {
        // 逐行读取存档文件内容
        String savedHealthStr = br.readLine();
        String savedLevelStr = br.readLine();
        String savedEquippedItem = br.readLine();

        // 将字符串格式的数值转换为整型
        int savedHealth = Integer.parseInt(savedHealthStr);
        int savedLevel = Integer.parseInt(savedLevelStr);

        // 将读取到的存档值回写到玩家对象(需确保Player类提供对应的setter,或属性为公开可修改)
        player.setHealth(savedHealth);
        player.setLevel(savedLevel);
        player.equippedItem = savedEquippedItem;
    } catch (Exception e) {
        System.out.println("There's an error.");
    }
}

如果需要保持原有带说明前缀的存档写入格式不变,只需要在读取字符串后做简单拆分提取数值即可,示例如下:

// 从"Your health is 100"这类格式的文本中提取最后一段的数值
String[] healthSegments = savedHealthStr.split(" ");
int savedHealth = Integer.parseInt(healthSegments[healthSegments.length - 1]);
注意事项
  • 必须确认Player类提供了setHealth、setLevel这类可修改属性的公共方法,如果属性是private修饰且没有对应setter,加载的数值无法真正写入玩家状态。
  • 建议加载时增加空值判断,避免存档文件损坏、内容缺失时抛出空指针异常导致游戏崩溃。
  • 不要将getter的返回值直接悬空调用,这类操作对对象状态没有任何修改效果。

内容的提问来源于stack exchange,提问作者WorkWork

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 11:15:03