在线程 "main" java.lang.ArrayIndexOutOfBoundsException 错误中出现异常,我一直在试图找出解决方案

Getting a Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException error, and am stuck trying to figure out a solution

我正在为学校项目编写一些代码。但是,我得到一个:

线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:索引 -1 超出长度 5 的范围 在 TicTacToe.main(TicTacToe.java:25)

(这是板[3-w1[i][0]][(w1[i][1])]='O';位)

这是示例输入:

5(数组大小)

1 0 0(要放在棋盘上的黑子数,后面是B对和B黑子的行列)

1 4 4(要放在棋盘上的白子数,后面是W对和W个白子的行列)

4 0 0 1 1 1 1 2 2 2 2 3 1 3 1 4 0(移动的次数,后接4个整数:Row 1 Column 1 Row 2 Column 2 即开始的行和列和移动的结束位置。即,R1 C1 的棋子移动到 R2 C2)

import java.util.Scanner;

public class TicTacToe {
  public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
  
    // Write your code here
    int i,j;
    int n=in.nextInt();
    char board[][]=new char[n][n];
    int b=in.nextInt();

    int b1[][]=new int[b][2];
    for(i=0;i<b;i++){
        b1[i][0]=in.nextInt();
        b1[i][1]=in.nextInt();
        board[3-b1[i][0]][b1[i][1]]='*';
    }
    
    int w=in.nextInt();
    int w1[][]=new int[w][2];
    for(i=0;i<w;i++){
        w1[i][0]=in.nextInt();
        w1[i][1]=in.nextInt();
        board[3-w1[i][0]][(w1[i][1])]='O';
    }

    for(i=0;i<n;i++){
      for(j=0;j<n;j++){
        if(board[i][j]!='*' && board[i][j]!='O')
          board[i][j]='.';
      }
    }
    int moves=in.nextInt();
    char tag;
    int m[][]=new int[moves*2][2];
    for(i=0;i<(moves*2);i++){
      m[i][0]=in.nextInt();
       m[i][1]=in.nextInt();
    }

    for(i=0;i<(moves*2);i++){
      tag=' ';
      tag=board[3-m[i][0]][m[i][1]];
      board[3-m[i][0]][m[i][1]]='.';
      i++;
      board[3-m[i][0]][m[i][1]]=tag;
    }
    for(i=0;i<n;i++){
      for(j=0;j<n;j++){
        System.out.print(board[i][j]+"");
      }
      System.out.println();
    }
  }
}

有没有办法解决这个错误?

调试此代码。

调试基本上意味着:通过 'hand' 遍历代码,并在脑海中弄清楚它应该做什么。必要时使用笔和纸。

然后,运行 实际代码并观察它实际做了什么。通常情况下,人们会使用调试器,但如果不知何故这感觉像是一项艰巨的任务,嘿,总是可以选择乱扔一大堆 System.out.println 语句。不管怎样,您必须深入了解系统正在做什么。

然后,程序 运行 与您想象的不同,猜猜是什么?你找到了一个!可能还有更多,但这绝对是一个问题。调查、修复、重新运行,继续进行直到应用正常运行。

所以,让我们来看看这个特定的案例:这个错误意味着你正在写 arr[i],其中 arr 是一个大小为 5 的数组,i 是 -1,并且java 不知道 -1 可能意味着什么。鉴于它是 board[3-w1[i][0]][(w1[i][1])]='O'; 行,这意味着 i 是 -1,或者,w1[i][0] 是 4(导致 3-4,即 -1),或者w1[i][1] 为-1。这是很多选项,这正是您需要调试的原因:显然,您认为这段代码使得这些东西中的 none 可能永远是 -1,但它们确实是。所以,打印所有这些东西。如果你不能弄清楚为什么你打印的东西是它的样子,那么找出那个变量的设置位置,并在每次调整它时打印出来。最终你会找出问题所在并解决它。

另一种方法是从 amazing voodoo magic coders Ltd 订购一个 Crystal 球,这就是专业编码员的工作方式:他们只是凝视它并找出错误所在,编写完美的代码,这就是为什么您日常使用的软件是 100% 无错误的。唉。要是。恐怕没有 crystal 球之类的东西。这就是我们所做的 - 调试我们的代码。