Java捕获自定义异常后修改无效测试分数输入的实现问题
解决异常后程序直接退出,实现修改无效输入的功能
我来帮你搞定这个问题!核心思路就是让程序在捕获到无效分数的异常后,不直接终止运行,而是提示用户重新输入合法的数值,直到得到有效的测试分数为止。下面是具体的实现方案:
1. 保留你的自定义异常类
你的InvalidTestScore异常类写得没问题,继续保留:
public class InvalidTestScore extends Exception { public InvalidTestScore() { super("Error: Invalid grade"); } public InvalidTestScore(int grade) { super("Error: " + grade + " is invalid!"); } }
2. 改造inputScores方法,加入异常捕获与循环重试逻辑
我们需要在获取每个分数的逻辑里加入循环,当捕获到异常时,提示用户重新输入,直到输入有效为止。同时还要处理用户输入非整数的情况(比如输入字符串),增强程序健壮性:
import java.util.InputMismatchException; import java.util.Scanner; public class ScoreInputHandler { /* 获取测试分数 */ public static int[] inputScores(int amount) { Scanner scanner = new Scanner(System.in); int[] scores = new int[amount]; for (int i = 0; i < amount; i++) { boolean isScoreValid = false; // 循环直到输入有效分数 while (!isScoreValid) { try { System.out.print("请输入第" + (i + 1) + "个测试分数: "); int score = scanner.nextInt(); // 验证分数范围,不合法则抛出自定义异常 if (score < 0 || score > 100) { throw new InvalidTestScore(score); } // 输入有效,存入数组并退出循环 scores[i] = score; isScoreValid = true; } catch (InvalidTestScore e) { // 捕获自定义异常,提示错误信息 System.out.println(e.getMessage()); scanner.nextLine(); // 清除缓冲区的无效输入,避免死循环 } catch (InputMismatchException e) { // 捕获非整数输入的异常 System.out.println("Error: 请输入有效的整数分数!"); scanner.nextLine(); // 清除缓冲区的非整数输入 } } } scanner.close(); return scores; } // 测试主方法 public static void main(String[] args) { int[] testScores = inputScores(3); System.out.println("你输入的有效分数为:"); for (int score : testScores) { System.out.print(score + " "); } } }
3. 关键逻辑说明
- 循环重试:用
while循环配合isScoreValid标志,只有当输入有效分数时才退出当前分数的输入循环。 - 异常捕获:
- 捕获自定义的
InvalidTestScore异常,提示用户输入的分数不合法。 - 捕获
InputMismatchException,处理用户输入非整数的情况,避免程序崩溃。
- 捕获自定义的
- 缓冲区清理:每次捕获异常后调用
scanner.nextLine(),清除输入缓冲区里的无效内容,防止下一次输入直接读取到之前的无效值导致死循环。
这样修改后,程序在遇到无效输入时不会直接退出,而是持续提示用户重新输入,直到得到合法的测试分数为止。
内容的提问来源于stack exchange,提问作者logitech2321
相关产品推荐
相关产品推荐

