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

Java战舰游戏程序:整数转数字数组时字符串索引越界错误求解

错误根因
  • 直接触发报错的原因是你用sc.nextInt()读取用户输入的数字串:用户输入的01110会被识别为整数1110,转成字符串后长度只有4,当size=5时循环访问第4位索引自然越界。而且前导0会直接丢失,完全不符合你逐位读取棋盘内容的需求。
  • 循环逻辑存在严重错误:
    1. 你在x遍历的循环内又嵌套了i从0到size的循环,重复给同一个board[y][x]赋值,完全没有意义
    2. 手动修改x、y变量控制循环的逻辑混乱,会导致重复赋值、越界访问等问题
    3. 直接将charAt()返回的字符ASCII值赋值给int数组,会导致数组存的是48(对应字符'0')和49(对应字符'1'),而不是你需要的0和1数值
修复方案

首先调整输入读取逻辑,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:45:08