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

求助:Java代码第30行出现ArrayIndexOutOfBoundsException异常

数组越界异常排查与修复

先看报错信息:Index 4 out of bounds for length 4,发生在createQuilt方法第30行,对应代码r * block[4].length——你的block(即myBlock)只有4行,索引范围是0-3,block[4]直接越界,应该用block[0].length来获取每行的长度(假设所有行长度一致)。

除此之外,代码里还有多处会导致异常或功能错误的问题,逐一修正:

1. createQuilt方法的参数与坐标错误

  • 第30行:block[4].length → 改为block[0].length
  • else分支中placeBlock的参数顺序颠倒,应该是placeBlock(quilt, flippedBlock, ...),原代码把flippedBlock和quilt的位置写反了
  • 放置block的起始坐标计算错误,行方向应该用r * block.length,列方向用c * block[0].length,原代码的行和列逻辑搞混

修正后的createQuilt:

public static void createQuilt(char[][] quilt, char[][] block) {
    char[][] flippedBlock = createFlipped(block);

    for (int r = 0; r < 3; r++) {
        for (int c = 0; c < 4; c++) {
            if (((r + c) % 2) == 0) {
                placeBlock(quilt, block, r * block.length, c * block[0].length);
            } else {
                placeBlock(quilt, flippedBlock, r * block.length, c * block[0].length);
            }
        }
    }
}

2. placeBlock方法的循环越界

循环条件c <= block[r].length会导致访问block[r][block[r].length],数组索引最大为length-1,所以改为<:

public static void placeBlock(char[][] quilt, char[][] block, int startRow, int startCol) {
    for (int r = 0; r < block.length; r++) {
        for (int c = 0; c < block[r].length; c++) { // 把<=改成<
            quilt[r + startRow][c + startCol] = block[r][c];
        }
    }
}

3. createFlipped方法的数组初始化与翻转逻辑错误

  • 原代码blockRows = block.length - 3会导致flipped数组只有1行,完全错误,应该和原block行数一致:blockRows = block.length
  • blockCols = block.length - 1错误,应该用原block的列数:blockCols = block[0].length
  • 翻转逻辑错误,原代码所有行都写到flipped的同一行,应该是原第row行对应翻转后的blockRows - 1 - row行

修正后的createFlipped:

public static char[][] createFlipped(char[][] block) {
    int blockRows = block.length;
    int blockCols = block[0].length;
    char[][] flipped = new char[blockRows][blockCols];
    
    for (int row = 0; row < blockRows; row++) {
        int flippedRow = blockRows - 1 - row;
        for (int col = 0; col < blockCols; col++) {
            flipped[flippedRow][col] = block[row][col];
        }
    }

    return flipped;
}

4. displayPattern方法的行列访问颠倒

原代码myArray[c][r]把行和列搞反了,应该是myArray[r][c],并且每行结束后加换行保证格式正确:

public static void displayPattern(char[][] myArray) {
    for (int r = 0; r < myArray.length; r++) {
        for (int c = 0; c < myArray[r].length; c++) {
            System.out.print(myArray[r][c]);
        }
        System.out.println();
    }
}

修正后的完整代码

public class BuggyQuilt {
    public static void main(String[] args) {

        char[][] myBlock = { { 'x', '.', '.', '.', '.' },
                             { 'x', '.', '.', '.', '.' },
                             { 'x', '.', '.', '.', '.' },
                             { 'x', 'x', 'x', 'x', 'x' } };
        char[][] myQuilt = new char[3 * myBlock.length][4 * myBlock[0].length];

        createQuilt(myQuilt, myBlock);

        displayPattern(myQuilt);
    }

    public static void displayPattern(char[][] myArray) {
        for (int r = 0; r < myArray.length; r++) {
            for (int c = 0; c < myArray[r].length; c++) {
                System.out.print(myArray[r][c]);
            }
            System.out.println();
        }
    }

    public static void createQuilt(char[][] quilt, char[][] block) {
        char[][] flippedBlock = createFlipped(block);

        for (int r = 0; r < 3; r++) {
            for (int c = 0; c < 4; c++) {
                if (((r + c) % 2) == 0) {
                    placeBlock(quilt, block, r * block.length, c * block[0].length);
                } else {
                    placeBlock(quilt, flippedBlock, r * block.length, c * block[0].length);
                }
            }
        }
    }

    public static void placeBlock(char[][] quilt, char[][] block, int startRow, int startCol) {
        for (int r = 0; r < block.length; r++) {
            for (int c = 0; c < block[r].length; c++) {
                quilt[r + startRow][c + startCol] = block[r][c];
            }
        }
    }

    public static char[][] createFlipped(char[][] block) {
        int blockRows = block.length;
        int blockCols = block[0].length;
        char[][] flipped = new char[blockRows][blockCols];
        
        for (int row = 0; row < blockRows; row++) {
            int flippedRow = blockRows - 1 - row;
            for (int col = 0; col < blockCols; col++) {
                flipped[flippedRow][col] = block[row][col];
            }
        }

        return flipped;
    }
}

内容的提问来源于stack exchange,提问作者Nijon Knight

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:54