【问题标题】:How do I fix this error?: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3如何修复此错误?:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 3
【发布时间】:2020-04-30 23:34:49
【问题描述】:

我一直在研究此代码几个小时,但无法弄清楚这部分。该程序应该是一个井字游戏,我在二维数组中的某个地方出错了,因为我不断收到这个错误。我还可以使用帮助来了解如何让随机生成器找到特定的行和列。

到目前为止,这是我的代码:

import java.util.Scanner;
import java.util.Random;

public class TicTacToe {
    public static void main(String[] args) {
        Scanner r = new Scanner(System.in);
        int rows = 3;
        int col = 3;
        int[][] grid = new int[rows][col];

        fillGrid(grid);
        computerTurn(grid);
    }//end main

    public static void fillGrid(int[][] grids) {
        //int [][] grids = new int [3][3];
        for (int r = 0; grids.length < 3; r++) {
            for (int c = 0; grids[r].length < 3; c++) {
                grids[r][c] = 0;
            }
        }
        printGrid(grids);
    }

    public static void printGrid(int[][] x) {
        for (int i = 0; i < x.length; i++) {
            for (int y = 0; y < x[0].length; y++) {
                System.out.print(x[i][y] + "\t");
            }
            System.out.println();
        }
    }

    public static void computerTurn(int[][] mygrid) {
        Random random = new Random();
        int rows = 3;
        int col = 3;
        //int [][] grid = new int [rows][col];
        //mygrid [rows][col] = random.nextInt(4);
        for (int r = 0; r < 3; r++) {
            for (int c = 0; c < 3; c++) {
                //mygrid [rows][col] = random.nextInt(2);
                if (mygrid[r][c] == 0) {
                    //mygrid [r][c] = random.nextInt(3);
                    mygrid[rows][col] = 1;
                }
                /*if (mygrid [r][c] != 0) {
                    //mygrid [rows][col] = random.nextInt(3);
                    mygrid [r][c] = 1;
                }*/
            }
        }
        printGrid(mygrid);
    }
}

【问题讨论】:

  • fillGrid() 不是必需的 - int 表元素默认初始化为 0
  • 分解computerTurn中需要完成的工作。 1. 生成随机行列索引(范围为 [0,2]!) 2. 检查单元格是否为空 3. 重复该过程,直到找到一个空单元格。
  • for (int r = 0; r &lt; grids.length; r++) {for(int c = 0; c &lt; grids[r].length; c++) {

标签: java multidimensional-array tic-tac-toe


【解决方案1】:

知道indexOutOfBoundsException 被扔在哪一行会很有用。从异常末尾的: 3,我们可以知道尽管someArr.length &lt; 4,在您的代码中的某处someArr[3] 被一个数组引用。

fillGrid 中嵌套循环的终止条件存在一些问题:

for (int r = 0; grids.length < 3; r++) {
    /* Loop never enters, because grids.length = 3 */
    for (int c = 0; grids[r].length < 3; c++) {
        /* Loop also never enters, because grids[r].length = 3 */
        grids[r][c] = 0;
    }
}

我认为你的意思是:

for (int r = 0; r < grids.length; r++) {
    for (int c = 0; c < grids[r].length; c++) {
        grids[r][c] = 0;
    }
}

我还建议用这样的终止语句替换 computerTurn 中的循环,因此该方法支持任意长度的数组。

关于您的异常,一旦您找到它发生的位置,请尝试打印您尝试访问的数组的长度并打印您尝试访问的索引。这样您就可以继续调试值错误的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 2012-10-29
    • 2011-07-07
    相关资源
    最近更新 更多