如何验证用户输入的行列是否为二维数组的有效索引范围?
解决演唱会座位预订程序的行列号校验与异常处理问题
核心问题分析
你当前的代码存在两个关键问题:
- 校验逻辑完全错误:
(rowSeat || colmnSeat) != arr1[rowSeat][colmnSeat]这个表达式既不符合语法逻辑,也无法实现“判断输入是否在数组范围内”的需求。而且你在修改数组之后才做校验,如果输入的行列号超出范围,会直接触发JVM自带的ArrayIndexOutOfBoundsException,根本走不到自定义异常的抛出逻辑。 - 缺少自定义异常的捕获分支:你抛出了
ArrayInputMismatchException,但没有对应的catch块处理,会导致程序直接终止,无法继续执行后续代码。
修正后的完整代码及解释
1. 保持自定义异常不变
你的自定义异常代码是正确的,无需修改:
public class ArrayInputMismatchException extends Exception { public ArrayInputMismatchException() {} public ArrayInputMismatchException(String message) { super(message); } }
2. 修正输入校验与异常处理逻辑
我们需要调整校验顺序,先判断输入是否有效,再修改数组;同时添加自定义异常的捕获分支,并用循环实现“输入错误后重新尝试”的需求:
import java.util.InputMismatchException; import java.util.Scanner; public class SeatBooking { public static void main(String[] args) { // 示例座位数组:4行3列(对应行号1-4,列号1-3) int[][] arr1 = new int[4][3]; Scanner userNum = new Scanner(System.in); boolean isValidInput = false; // 循环直到用户输入有效 while (!isValidInput) { int rowSeat = 0; int colmnSeat = 0; try { System.out.println("请输入座位所在的行号:"); rowSeat = userNum.nextInt(); System.out.println("\n请输入座位所在的列号:"); colmnSeat = userNum.nextInt(); // 1. 先校验输入的行列号是否在有效范围内 // 行号有效范围:1到数组的行数(arr1.length) // 列号有效范围:1到每行的列数(arr1[0].length,假设所有行列数相同) if (rowSeat < 1 || rowSeat > arr1.length || colmnSeat < 1 || colmnSeat > arr1[0].length) { throw new ArrayInputMismatchException("错误:输入的行号或列号不在有效范围内,请输入1-" + arr1.length + "的行号和1-" + arr1[0].length + "的列号。"); } // 2. 校验通过后,修改座位状态 arr1[rowSeat - 1][colmnSeat - 1] = 1; System.out.println("\n座位预订成功!"); isValidInput = true; // 标记输入有效,退出循环 } catch (InputMismatchException e) { System.out.println("\n错误:请输入有效的数字,不能输入字符或符号。"); userNum.nextLine(); // 清空输入缓冲区,避免死循环 } catch (ArrayInputMismatchException e) { System.out.println("\n" + e.getMessage()); // 无需清空缓冲区,因为nextInt()已经读取了有效数字只是范围不对 } } // 后续代码:比如打印座位状态等 userNum.close(); } }
关键修改点说明
- 调整校验顺序:先判断输入的行列号是否在有效范围,再修改数组,避免触发
ArrayIndexOutOfBoundsException。 - 正确的校验逻辑:
- 行号的有效范围是
1到arr1.length(因为用户输入的是1-based编号,数组索引是0-based) - 列号的有效范围是
1到arr1[0].length(假设所有行的列数一致)
- 行号的有效范围是
- 添加自定义异常的捕获分支:捕获
ArrayInputMismatchException并提示用户,程序不会终止,而是回到循环重新输入。 - 循环重试机制:用
while循环包裹输入流程,直到用户输入有效的行列号,保证程序可以继续执行后续代码。 - 输入缓冲区处理:在捕获
InputMismatchException后,调用userNum.nextLine()清空缓冲区,避免后续的nextInt()读取到无效的残留输入导致死循环。
内容的提问来源于stack exchange,提问作者sirrene
相关产品推荐
相关产品推荐

