簡體   English   中英

為什么會出現“ ArrayIndexOutOfBoundsException”錯誤?

[英]Why am I getting an “ArrayIndexOutOfBoundsException” error?

我編寫了一個程序,其中用戶輸入二維數組的維,然后計算機打印出具有這些維的表,並用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重命名為row,將t重命名為column,則可能更容易理解:

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 row

在check_horizo​​ntal中,您交換了i和t。 從你的循環

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

您將需要使用

randomTable[i][t]

而不是與randomTable [t] [i]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM