
本文详解如何安全读写highscore.txt文件,解决因流未重置导致的nosuchelementexception异常,实现游戏最高分的正确读取与更新。
本文详解如何安全读写highscore.txt文件,解决因流未重置导致的nosuchelementexception异常,实现游戏最高分的正确读取与更新。
在Java贪吃蛇游戏中集成高分持久化功能是提升用户体验的关键一步。但如示例代码所示,直接复用已关闭或未重置的FileInputStream会导致java.util.NoSuchElementException——根本原因在于:调用myWriter.close()后,原fileByteStream仍处于关闭状态,而后续却试图用它构造新Scanner,此时inFS.nextInt()必然失败。
以下是经过重构、健壮且符合最佳实践的highScoreChecker()方法实现:
public int highScoreChecker() {
int currentHighScore = 0;
// 步骤1:安全读取现有高分(使用try-with-resources自动关闭资源)
try (FileInputStream fis = new FileInputStream("HighScore.txt");
Scanner inFS = new Scanner(fis)) {
if (inFS.hasNextInt()) {
currentHighScore = inFS.nextInt();
}
} catch (FileNotFoundException e) {
// 文件不存在时视为首次运行,高分初始化为0
System.out.println("HighScore.txt not found. Starting with high score = 0.");
currentHighScore = 0;
} catch (Exception e) {
System.err.println("Error reading high score: " + e.getMessage());
currentHighScore = 0;
}
// 步骤2:若当前得分更高,则写入新高分(同样使用try-with-resources)
if (applesEaten > currentHighScore) {
try (FileWriter writer = new FileWriter("HighScore.txt")) {
writer.write(String.valueOf(applesEaten));
currentHighScore = applesEaten; // 直接赋值,无需二次读取
System.out.println("New high score saved: " + applesEaten);
} catch (IOException e) {
System.err.println("Failed to write high score: " + e.getMessage());
}
}
return currentHighScore;
}
✅ 关键改进点说明:
- 资源自动管理:使用 try-with-resources 语法确保FileInputStream和FileWriter在作用域结束时自动关闭,彻底避免流泄漏与重复使用问题;
- 空值防护:inFS.hasNextInt() 防止nextInt()在无整数输入时抛出NoSuchElementException;
- 逻辑简化:更新高分后直接将applesEaten赋给currentHighScore,不再尝试重新打开同一文件读取——既提升性能,又杜绝竞态风险;
- 容错增强:对FileNotFoundException和通用IOException分别处理,保证程序在文件缺失或磁盘异常时仍能稳定运行。
⚠️ 注意事项:
- 确保HighScore.txt位于项目工作目录(通常为src同级或out/production/your-project-name),或使用绝对路径/getClass().getResource()定位;
- 若需在游戏结束界面(如gameOver())中显示高分,请在draw()或gameOver()中调用highScoreChecker()并缓存结果,避免每帧重复IO操作;
- 多线程环境下(如Swing事件线程+定时器),该方法已天然线程安全(无共享可变状态),但若扩展为网络高分榜,需额外加锁。
通过以上改造,你的贪吃蛇游戏不仅能可靠保存最高分,还能在任意得分下稳定运行,真正实现“一次编写,永久留存”的玩家成就体验。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











