Java战舰游戏程序:整数转数字数组时字符串索引越界错误求解
错误根因
- 直接触发报错的原因是你用
sc.nextInt()读取用户输入的数字串:用户输入的01110会被识别为整数1110,转成字符串后长度只有4,当size=5时循环访问第4位索引自然越界。而且前导0会直接丢失,完全不符合你逐位读取棋盘内容的需求。 - 循环逻辑存在严重错误:
- 你在x遍历的循环内又嵌套了i从0到size的循环,重复给同一个
board[y][x]赋值,完全没有意义 - 手动修改x、y变量控制循环的逻辑混乱,会导致重复赋值、越界访问等问题
- 直接将
charAt()返回的字符ASCII值赋值给int数组,会导致数组存的是48(对应字符'0')和49(对应字符'1'),而不是你需要的0和1数值
- 你在x遍历的循环内又嵌套了i从0到size的循环,重复给同一个
修复方案
首先调整输入读取逻辑,用nextLine()读取完整的一行字符串,避免前导0丢失和长度错误;其次简化循环逻辑,逐行读取输入后逐位拆分赋值即可。
修复后的代码如下:
public static void main(String[] args) { int ships_num; Scanner sc; int size; int[][] board; sc = new Scanner(System.in); do { System.out.println("请输入战舰数量,最大为10:"); ships_num = sc.nextInt(); } while (ships_num > 10 || ships_num < 1); // 补充合法性校验,避免输入负数 System.out.println("战舰数量:" + ships_num); do { System.out.println("请输入正方形棋盘的边长,最大为20:"); size = sc.nextInt(); } while (size > 20 || size < 1); // 补充合法性校验,避免输入负数 System.out.println("棋盘边长:" + size); sc.nextLine(); // 吃掉nextInt()残留的换行符,避免后续读行拿到空串 board = new int[size][size]; // 逐行读取棋盘内容 for (int y = 0; y < size; y++) { System.out.printf("请输入第%d行的棋盘内容,需输入%d位0/1数字:%n", y+1, size); String line = sc.nextLine().trim(); // 可选补充校验,避免用户输入长度不对的内容 while (line.length() != size) { System.out.printf("输入长度错误,请重新输入%d位0/1数字:%n", size); line = sc.nextLine().trim(); } // 逐位赋值 for (int x = 0; x < size; x++) { board[y][x] = line.charAt(x) - '0'; // 字符转成对应的0/1数值 } } // 后续可继续添加合法性校验逻辑 }
内容的提问来源于stack exchange,提问作者Ceri Barnes
相关产品推荐
相关产品推荐

