求助: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
相关产品推荐
相关产品推荐

