如何在Java选座程序中处理两位数行号的输入?
问题分析
你的代码报错核心原因是错误处理了多位数行号的输入:
- 输入
10A时,seatchoice.charAt(0)取到字符'1',计算行索引为'1'-'1'=0,完全偏离了目标的第10行; - 紧接着
seatchoice.charAt(1)取到字符'0','0'-'A'的结果是48-65=-17,直接触发数组索引越界错误。
本质是你默认行号只有1位,没有拆分输入中的数字行号和字母列号,导致逻辑完全失效。
修正方案
以下是修复后的代码片段,同时优化了初始化逻辑和错误处理:
// 需要导入java.util.Arrays import java.util.Arrays; // ... 其他代码 ... if (choice == 'c') { input.nextLine(); String seatchoice = input.nextLine(); // 初始化座位数组,用Arrays.fill简化赋值 char[][] seats = new char[13][6]; for (int i = 0; i < seats.length; i++) { Arrays.fill(seats[i], '*'); } // 拆分输入中的数字行号和字母列号 int splitPos = 0; // 找到第一个非数字字符的位置,作为拆分点 while (splitPos < seatchoice.length() && Character.isDigit(seatchoice.charAt(splitPos))) { splitPos++; } // 转换行号(数组索引从0开始,需减1) int row = Integer.parseInt(seatchoice.substring(0, splitPos)) - 1; // 转换列号 char colChar = seatchoice.charAt(splitPos); int col = colChar - 'A'; // 校验索引合法性,避免越界 if (row >= 0 && row < seats.length && col >= 0 && col < seats[0].length) { if (seats[row][col] != 'x') { seats[row][col] = 'x'; System.out.println(" "); printSeats(seats); } else { System.out.println("该座位已被占用"); } } else { System.out.println("座位号格式错误或超出范围"); } } // ... 你的printSeats方法保持不变 ...
关键修改说明
- 输入拆分逻辑:通过遍历找到数字与字母的分界点,不管行号是1位还是多位,都能准确提取行号数字和列号字母;
- 索引合法性校验:增加行、列索引的范围检查,避免非法输入直接导致程序崩溃;
- 简化初始化:用
Arrays.fill替代手动逐个赋值,代码更简洁; - 错误提示:对已占用座位、非法输入给出明确反馈,提升交互体验。
测试验证
输入10A时,splitPos会定位到2(前两位是数字),substring(0,2)得到"10",转成整数后减1得到数组索引9(对应第10行);colChar为'A',计算得列索引0(对应A列),即可正确将目标座位标记为x。
内容的提问来源于stack exchange,提问作者Cha
相关产品推荐
相关产品推荐

