Java二维数组录入校验核心是提前拦截非法索引和无效输入,需将用户1起始的行列号转为0起始索引,分层校验类型、范围与语义,并用自定义异常封装业务含义。

Java 规则二维数组的数据录入校验,核心在于提前拦截非法索引和拒绝无效输入,而不是等访问时抛异常再补救。关键不是“能不能存”,而是“该不该让这组坐标进入数组逻辑”。下面从实操角度讲清楚怎么落地。
明确数组边界与用户习惯的转换关系
规则二维数组(如 int[3][4])行数固定为 arr.length,每行列数一致,取 arr[0].length 即可。但用户输入通常是 1 起始编号(第 1 行、第 1 列),而 Java 索引是 0 起始。所以必须做转换:
- 用户输入行号
rowInput→ 实际索引为rowInput - 1 - 用户输入列号
colInput→ 实际索引为colInput - 1 - 合法范围判断:行索引 ∈ [0, arr.length−1],列索引 ∈ [0, arr[0].length−1]
分层校验:先类型,再范围,最后语义
一次输入可能同时出错,要按优先级逐层拦截,避免低级错误掩盖深层问题:
-
类型校验:用
Scanner.hasNextInt()判断是否为整数;若非数字,next()会卡住,需调用nextLine()清空缓冲区 -
范围校验:转换后检查是否
或 <code>>= 对应维度长度,例如:if (r = arr.length || c = arr[0].length) -
语义校验(可选):比如座位系统中,同一位置不能重复录入,可额外维护一个
boolean[][] occupied标记
用自定义异常封装业务含义
不要直接 throw new Exception("错了"),而是定义清晰、可捕获、带上下文的异常:
立即学习“Java免费学习笔记(深入)”;
class InvalidSeatInputException extends Exception {
public InvalidSeatInputException(String message) {
super("座位输入错误: " + message);
}
}在校验失败处抛出:throw new InvalidSeatInputException("行号 " + rowInput + " 超出范围 [1," + arr.length + "]");
调用方能统一处理提示,不影响主流程结构。
完整校验+录入循环示例
以“录入一个座位值”为例,封装成健壮方法:
public static void inputAtPosition(int[][] arr, Scanner sc)
throws InvalidSeatInputException {
System.out.print("请输入行号(1-" + arr.length + "): ");
if (!sc.hasNextInt()) {
sc.nextLine(); // 清空非法输入
throw new InvalidSeatInputException("输入非数字");
}
int row = sc.nextInt();
<pre class="brush:php;toolbar:false;">System.out.print("请输入列号(1-" + arr[0].length + "): ");
if (!sc.hasNextInt()) {
sc.nextLine();
throw new InvalidSeatInputException("输入非数字");
}
int col = sc.nextInt();
sc.nextLine(); // 消费换行符,避免干扰后续 nextLine()
int r = row - 1, c = col - 1;
if (r < 0 || r >= arr.length || c < 0 || c >= arr[0].length) {
throw new InvalidSeatInputException(
String.format("位置(%d,%d)越界,有效范围:行[1,%d] 列[1,%d]",
row, col, arr.length, arr[0].length)
);
}
System.out.print("请输入数值: ");
if (!sc.hasNextInt()) {
sc.nextLine();
throw new InvalidSeatInputException("数值输入非整数");
}
arr[r][c] = sc.nextInt();
sc.nextLine(); // 清理}
调用时用 try-catch 包裹,提示用户重试即可,不中断程序。


















