![](/img/trans.png)
[英]Why am I getting an ArrayIndexOutOfBoundsException error?
[英]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_horizontal方法中,您的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_horizontal中,您交換了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.