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
相关产品推荐
相关产品推荐

