Java实现保留最高分功能:代码问题排查与修正技术问询
Java 保留最高分功能:代码修正与问题解析
嗨,我来帮你搞定这个Java程序的问题!你想要实现的是输入分数并保留最高分的功能对吧?先看看你原来代码里的几个核心问题,再给你修正后的可运行版本~
原代码存在的问题
假设你的原代码是这样的(符合你提到的错误点):
import java.util.Scanner; public class HighScore { public static void main(String[] args) { int highScore = 0; while (true) { Scanner input = new Scanner(System.in); // 每次循环重复创建Scanner System.out.print("请输入分数(输入-1退出):"); int score = input.nextInt(); if (score > highScore) { // 条件判断顺序错误,未优先处理退出逻辑 highScore = score; System.out.println("新的最高分:" + highScore); } else if (score == -1) { System.out.println("最终最高分:" + highScore); break; } else { System.out.println("当前最高分仍是:" + highScore); } input.close(); // 循环内关闭Scanner,导致后续输入报错 } } }
这里的三个关键错误:
- 重复创建并提前关闭Scanner:每次循环都新建Scanner,还在循环内关闭,第二次循环时Scanner已经被关闭,会直接抛出
NoSuchElementException - 条件判断顺序颠倒:先判断分数是否大于最高分,再判断退出指令
-1,导致输入-1时会先和最高分比较(比如初始最高分是0,-1不大于0,会走else分支,根本不会触发退出) - 退出逻辑失效:因为判断顺序问题,退出指令无法被正确识别,程序无法正常终止
修正后的完整代码
import java.util.Scanner; public class HighScore { public static void main(String[] args) { int highScore = 0; // 只初始化一次Scanner,放在循环外部 Scanner input = new Scanner(System.in); while (true) { System.out.print("请输入分数(输入-1退出):"); // 新增:校验输入是否为有效整数,避免非数字输入导致崩溃 if (input.hasNextInt()) { int score = input.nextInt(); // 优先处理退出逻辑,确保输入-1时直接终止程序 if (score == -1) { System.out.println("最终最高分:" + highScore); break; } // 再判断是否需要更新最高分 if (score > highScore) { highScore = score; System.out.println("新的最高分:" + highScore); } else { System.out.println("当前最高分仍是:" + highScore); } } else { System.out.println("请输入有效的整数分数!"); input.next(); // 清除无效输入,防止程序陷入死循环 } } // 循环结束后统一关闭Scanner input.close(); } }
修正点说明
- Scanner生命周期优化:只在程序开始时创建一次Scanner,循环结束后再关闭,避免重复实例化和提前关闭导致的输入异常
- 逻辑优先级调整:把退出条件放在最前面判断,确保用户输入
-1时直接触发退出,不会被其他逻辑干扰 - 输入合法性校验:添加
hasNextInt()判断,处理用户输入非整数的情况,同时用input.next()清除无效输入,防止程序卡住 - 代码可读性提升:拆分逻辑分支,让每个条件块的职责更清晰,后续维护也更方便
内容的提问来源于stack exchange,提问作者Petr Cina
相关产品推荐
相关产品推荐

