java - 为什么我收到 "ArrayIndexOutOfBoundsException"错误?

标签 java arrays indexoutofboundsexception

我编写了一个程序,其中用户输入二维数组的维度,然后计算机打印出具有这些维度的表格,并用 0 到 9 的随机整数填充它。然后,如果有四个连续的如果整数出现在表中的任意位置,则计算机将返回“True”。如果表中没有连续的相等整数,则返回“False”。例如:

2 5 8 7 1
3 2 9 4 7
5 1 2 0 3
8 0 1 2 7

在该表中,两个连续出现,从第一个位置斜向出现。也可以是这样的:

9 5 3 7 0
2 5 7 3 1
8 5 0 2 9
4 5 1 7 5

在此表中,从第二个位置开始垂直向下显示五个。

这是我编写的代码:

/*MyName*/
package fourconsecutivenumbers;
import java.util.Random;
import java.util.Scanner;
public class FourConsecutiveNumbers {

public static void main(String[] args) {

    Scanner rowDimension = new Scanner(System.in);
    System.out.print("Enter the number of rows: ");
    int firstInput = rowDimension.nextInt();

    Scanner columnDimension = new Scanner(System.in);
    System.out.print("Enter the number of columns: ");
    int secondInput = columnDimension.nextInt();

    int[][] randomTable = new int[firstInput][secondInput];
    for (int row = 0; row < firstInput; row++) {
        for (int column = 0; column < secondInput; column++) {
            randomTable[row][column] = (int)(Math.random() * 10 + 0);
            System.out.print(randomTable[row][column] + " ");
        }
        System.out.println();
    }
    if(check_horizontal(randomTable) || check_vertical(randomTable) || check_diagonal(randomTable)){
   System.out.println("True");
   }
   else {
    System.out.println("False");
    }
   }


public static boolean check_vertical(int[][] randomTable) {

    for (int i = 0; i<randomTable.length-3; i++){
        for(int t=0; t<randomTable[0].length-3;t++){
        if (randomTable[i][t]==randomTable[i][t+1] && randomTable[i][t+1]==randomTable[i][t+2] && randomTable[i][t+2]==randomTable[i][t+3]){
            return true;
        }
    }
}
return false;
}
 public static boolean check_horizontal(int[][] randomTable){

     for (int i = 0; i<randomTable.length; i++){
        for(int t=0; t<randomTable[0].length;t++){
        if (randomTable[t][i]==randomTable[t+1][i] && randomTable[t+1][i]==randomTable[t+2][i] && randomTable[t+2][i]==randomTable[t+3][i]){
            return true;
        }
    }

}
return false;
}
 public static boolean check_diagonal(int[][] randomTable){
//check down    
for (int t =0; t<randomTable.length-3; t++){
    for(int i=0; i<randomTable[0].length-3;i++){
        if (randomTable[i][t]==randomTable[i+1][t+1] && randomTable[i+1][t+1]==randomTable[i+2][t+2] && randomTable[i+2][t+2]==randomTable[i+3][t+3]){
            return true;
        }

    }
}
//check up
for (int t = 3; t < randomTable.length; t++){
for(int i=0; i<randomTable[0].length-3;i++){
    if (randomTable[t][i]==randomTable[t-1][i+1] && randomTable[t-1][i+1]==randomTable[t-2][i+2] && randomTable[t-2][i+2]==randomTable[t-3][i+3]){
        return true;
    }

}
}
return false;
}
}

现在,每当我输入不同的维度时,就会出现错误。就像 5x10 表或 10x5 表一样...但是如果我要做 5x5 表或 10x10 表,它就会执行。我得到的错误是...

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at fourconsecutivenumbers.FourConsecutiveNumbers.check_horizontal(FourConsecutiveNumbers.java:49)
at fourconsecutivenumbers.FourConsecutiveNumbers.main(FourConsecutiveNumbers.java:25)
Java Result: 1

我是编程新手,但我知道错误来自第 49 行。也许我写错了 for 循环?我真的不知道我做错了什么,我希望有人能告诉我我做错了什么以及如何解决它,这样我就可以知道什么不该做。

最佳答案

在 check_horizo​​ntal 方法中,你的 i 和 t 是从后到前的

if (randomTable[t][i]==randomTable[t+1][i] &&
    randomTable[t+1][i]==randomTable[t+2][i] && 
    randomTable[t+2][i]==randomTable[t+3][i]){
  return true;
}

应该是

if (randomTable[i][t]==randomTable[i+1][t] &&
    randomTable[i+1][t]==randomTable[i+2][t] && 
    randomTable[i+2][t]==randomTable[i+3][t]){
  return true;
}

正如评论中所指出的,您的循环条件也不正确:

for (int i = 0; i<randomTable.length; i++){
   for(int t=0; t<randomTable[0].length;t++){

应该是

for (int i = 0; i<randomTable.length - 3; i++){
   for(int t=0; t<randomTable[i].length;t++){

顾名思义,这是垂直检查而不是水平检查,但由于 check_vertical 实际上是水平检查,这不会对您的程序(只是您的标记)产生不利影响。

第一点(i 和 t 混合在一起)是由于您要检查的长度 i 仅限于 randomTable 的长度(即行数),而 t 仅限于第零个数组 t < randomTable[0].length 的长度(这是列数),但在您的代码中,您使用 i 作为列的索引,使用 t 作为行的索引。

如果您将 i 重命名为行,将 t 重命名为列,可能会更容易理解,如下所示:

private int getNumberOfRows(int[][] table) { return table.length; }
private int getNumberOfColumnsInRow(int[][] table, int row) { return table[row].length }
...
for (int row = 0; row < getNumberOfRows(randomTable) - 3; row++){
   for(int column = 0; column<getNumberOfColumnsInRow(randomTable,i);column++){
<小时/>

对于第二点循环条件不正确,因为您要向行索引(方括号中的第一个数字)添加 3,您需要确保在 row 之后还有至少 3 行。

关于java - 为什么我收到 "ArrayIndexOutOfBoundsException"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27259284/

相关文章:

java.lang.IndexOutOfBoundsException异常

java - Android 获取 IndexOutOfBundException

java - 有没有办法从Java中的FileDialog获取目录路径?

java - 如何实现参数数量未知的方法?

java - 聚合函数 MAX 和 AVG 不适用于 Hibernate HQL 中的 DATEDIFF

java - 在本地模式下运行一个简单的级联应用程序

c# - 连续查找5个相同颜色的元素

javascript - 在javascript中找到第i个排列

c# - 你如何在 C#/csharp 中返回 2 个变量?

java - 查找数组中最小元素的索引 (Java)