#java #indexoutofboundsexception
#java #исключение indexoutofboundsexception
Вопрос:
Я пишу немного кода для школьного проекта. Тем не менее, я получаю:
Исключение в потоке «main» java.lang.Исключение ArrayIndexOutOfBoundsException: индекс -1 выходит за пределы длины 5 в TicTacToe.main(TicTacToe.java:25)
(Это плата [3-w1 [i][0]][(w1 [i][1])]= ‘O’; бит)
Это пример ввода:
5 (размер массива)
10 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 целых числа: Строка 1 столбец 1 Строка 2 Столбец 2, который является строкой и столбцом начальной и конечной позиции хода. Т.Е. фигура в R1C1 перемещается в 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]!='*' amp;amp; 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();
}
}
}
Есть ли способ исправить ошибку?
Ответ №1:
Отладьте этот код.
Отладка в основном означает: просмотрите код «вручную» и прикиньте в своей голове, что он должен делать. При необходимости используйте ручку и бумагу.
Затем запустите фактический код и посмотрите, что он на самом деле делает. Обычно используется отладчик, но если это кажется каким-то сложным, эй, всегда есть возможность разбросать кучу System.out.println
инструкций. Так или иначе, вы должны получить представление о том, что делает система.
Затем, когда программа запускается не так, как вы думали, что произойдет, угадайте, что? Вы нашли его! Может быть больше, но это определенно проблема. Исследуйте, исправляйте, запускайте повторно, продолжайте, пока приложение не заработает.
Итак, давайте перейдем к этому конкретному случаю: эта ошибка означает, что вы пишете arr[i]
where 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 . Это много вариантов, именно поэтому вам нужно отлаживать: очевидно, вы думаете, что этот код таков, что ни одна из этих вещей никогда не может быть -1, но они есть. Итак, распечатайте все это. Если вы не можете понять, почему то, что вы печатаете, является тем, что оно есть, затем выясните, где установлена эта переменная, и печатайте каждый раз, когда вы ее настраиваете. В конце концов вы поймете, в чем проблема, и исправите ее.
Альтернативой является то, что вы заказываете Хрустальный шар у amazing voodoo magic coders Ltd. Именно так работают профессиональные программисты: они просто смотрят в него и угадывают, где есть ошибки, пишут идеальный код, поэтому программное обеспечение, которое вы используете ежедневно, на 100% не содержит ошибок. Увы. Если только. Боюсь, нет такой вещи, как хрустальные шары. Это то, что мы все делаем — отлаживаем наш код.
Комментарии:
1. Я должен был быть немного яснее в своем вопросе. Причина ошибки — w1 [i] [0] = 4, поэтому 3-4 равно -1, и поэтому я получаю ошибку OutOfBounds
2. Причина, по которой я задал этот вопрос здесь, заключается в том, что этот проект должен быть завершен завтра, и я немного запаниковал, так как я занимался этой проблемой в течение последнего часа или около того, пробуя разные вещи, но в конечном итоге не работает