Исключение за пределами границ в двумерном массиве - PullRequest
2 голосов
/ 19 июня 2019

Попытка найти сумму всех четных чисел и произведение всех нечетных чисел в двумерном массиве.

Почему я получаю следующую ошибку исключения из границ?

Exception java. lang. Array Index Out Of Bounds Exception

При выполнении кода это исключение происходит для строки if(m[i][j]%2==0)

photo of code

Ответы [ 4 ]

2 голосов
/ 19 июня 2019

Точная причина вашей ошибки в том, что ваш 2D-массив на самом деле является неровным массивом, что означает, что не каждая строка содержит одинаковое количество элементов.На самом деле, вторая строка содержит только три элемента, поэтому, когда вы при следующей проверке if проверяете:

if (m[i][j]%2 == 0)

, вы получаете исключение вне границ для i=1 и j=3.

Вы должны либо сделать массив 2D без зубцов, либо использовать вместо этого for цикл:

for (int i=0; i < 4; ++i) {
    for (int j=0; j < m[i].length; ++j) {
            if (m[i][j]%2 == 0) {
                s += m[i][j];
            }
            else {
                r *= m[i][j];
            }
        }
    }
}
1 голос
/ 19 июня 2019

Не использовать в качестве пределов фиксированные значения (например, 4), но вместо использовать length при условии по массиву (ам).

for (int i = 0; i < m.length; i++) {
    for (int j = 0; j < m[i].length; j++) {
      //...
    }
}

Почему?

Не все внутренние массивы имеют 4 элемента (то есть: {30, 11, 71}), поэтому на последней итерации внутреннего цикла (j = 3) этот код m[i][j] пытается получить доступ к значению за пределами массива потому что в некоторых случаях нет позиции 3, просто 0 (1-й элемент), 1 (2-й элемент) и 2 (3-й элемент). Таким образом вы получите упомянутое исключение.

Примечание: :

Другая проблема (, упомянутая вами ) заключается в том, что вы получите r = 0 всегда, потому что оно инициализируется 0, и каждый раз, когда вы умножаете его значение на другое, результат будет 0.

Итак, чтобы исправить это, вам нужно добавить проверку в условии else, например:

else {
    r = r == 0 ? m[i][j] : r * m[i][j];
}
1 голос
/ 19 июня 2019

В элементе массива m по индексу 1 отсутствует четвертый элемент:

{30,11,71}
0 голосов
/ 19 июня 2019

Замените ваши i < 4 на i < m.length и j < 4 на j < m[i].length

...