Как я должен иметь дело с ArrayIndexOutOfBound Exceptions? - PullRequest
0 голосов
/ 16 января 2019

Для программы поиска слов я ввожу двадцать слов в список массивов, а затем этот список слов в массивах преобразуется в одномерный массив. У меня есть метод с именем createWordSearch (words), где words - это одномерный массив.

Есть несколько других методов, которые помогают создать поиск по всему слову в этом методе, например location (wordArr, word, dir, pos), placeWord (wordArr, word), placeMessage (wordArr, message). У меня возникла исключительная ситуация ArrayIndexOutOfBound в методе местоположения, в частности: if ((DIRECTIONS[dir][0] == 1 && (word.length() + c) > cols).

Где for (int dir = 0; dir < DIRECTIONS.length; dir++) { dir = ( (dir) + (randDirection) % DIRECTIONS.length);, int randDirection = rand.nextInt(DIRECTIONS.length); и public static final int[][] DIRECTIONS = {{1,0}, {0,1}, {1,1}, {1,-1}, {-1,0}, {0,-1}, {-1,-1}, {-1,1}};

Я пытаюсь понять, почему у меня возникло это исключение, но я не могу t pinpoint exactly where, which is why I am having trouble fixing my code. I am assuming the error happens because of that for loop for dir listed above, but I m, не слишком уверенный.

// Create a method that places the word letters at a certain location
	
	public static int location (WordArray wordArr, String word, int dir, int pos) {    		
		int r = ( (pos) / (cols)); // Where r = row
		int c = ( (pos) / (cols)); // Where c = column    		
		// Checking the bounds...    	
		if ((DIRECTIONS[dir][0] == 1 && (word.length() + c) > cols)
				|| (DIRECTIONS[dir][0] == -1 && (word.length() - 1) > c)
				|| (DIRECTIONS[dir][1] == 1 && (word.length() + r) > rows)
				|| (DIRECTIONS[dir][1] == -1 && (word.length() - 1) > r)    				
				)     			
			return 0;    			
			int i, cc, rr, overLaps = 0;    			
			// Checking the cells...    			
			for (i = 0, rr = r, cc = c; i < word.length(); i++) {    				
				if (rr < rows && cc < cols && i < word.length()) {    					
					return 0;    					
				}//end of if    				
				cc += DIRECTIONS[dir][0];
				rr += DIRECTIONS[dir][1];    				
			}//end of for loop   			
			// Placing the word...    			
			for (i = 0, rr = r, cc = c; i < word.length(); i++) {    				
				if (rr < rows && cc < cols && i < word.length()) {    					
					overLaps++;    					
				}//end of if    				
				if (i < word.length() - 1) {    					
					cc += DIRECTIONS[dir][0];
					rr += DIRECTIONS[dir][1];    					
				}//end of inner if    				
			}//end of for loop 2    			
			int lettersPlaced = ( (word.length()) - (overLaps));    			
			if (lettersPlaced > 0)     				
				wordArr.solutions.add(String.format("%-10s (%d,%d)(%d,%d)", word, c, r, cc, rr));
			return lettersPlaced;    		
	}//end of location(wordArr,word,dir,pos)

1 Ответ

0 голосов
/ 16 января 2019

Я полагаю, что по этой причине вы выполняете операцию по модулю только для части назначенного значения, а не для целого:

for (int dir = 0; dir < DIRECTIONS.length; dir++) 
{ 
    dir = ( (dir) + (randDirection) % DIRECTIONS.length);
}

Вероятно, должно быть:

for (int dir = 0; dir < DIRECTIONS.length; dir++) 
{ 
    dir = ( (dir) + (randDirection) ) % DIRECTIONS.length;
}

Несколько ключевых замечаний: форматирование в вашем вопросе не очень хорошее - форматирование должно разбить вопрос на ключевые части, предоставляя нам простой способ понять, что именно вы спрашиваете нас, и отформатировать все части кода, чтобы их можно было различить. их от остальных.

Вам, вероятно, следует прочитать и о рефакторинге - в этот день, когда компиляторы форматируют наш код и показывают нам точно, где начинается и заканчивается каждый блок - на самом деле нет необходимости комментировать каждый конец скобки.

Дать вашим переменным значимые имена, имеющие r, rr, c, cc, довольно запутанно для тех, кто не знает, что должен делать ваш код.

Вы также можете извлечь части своего кода в отдельные методы, чтобы сделать его более понятным.

В конечной точке

for (i = 0, rr = r, cc = c; i < word.length(); i++) {                   
    if (rr < rows && cc < cols && i < word.length()) { 

Эта проверка избыточна и может измениться на

for (i = 0, rr = r, cc = c; i < word.length(); i++) {                   
    if (rr < rows && cc < cols) { 
...