You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证用户输入的行列是否为二维数组的有效索引范围?

解决演唱会座位预订程序的行列号校验与异常处理问题

核心问题分析

你当前的代码存在两个关键问题:

  1. 校验逻辑完全错误:(rowSeat || colmnSeat) != arr1[rowSeat][colmnSeat] 这个表达式既不符合语法逻辑,也无法实现“判断输入是否在数组范围内”的需求。而且你在修改数组之后才做校验,如果输入的行列号超出范围,会直接触发JVM自带的ArrayIndexOutOfBoundsException,根本走不到自定义异常的抛出逻辑。
  2. 缺少自定义异常的捕获分支:你抛出了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:35:42