Не использовать в качестве пределов фиксированные значения (например, 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];
}