Что вызывает ArrayIndexOutOfBoundsException
?
Если вы думаете о переменной как о «поле», где вы можете поместить значение, то массив представляет собой ряд ящиков, расположенных рядом с eachother, где число Ячейки представляют собой конечное и явное целое число.
Создание такого массива:
final int[] myArray = new int[5]
создает строку из 5 полей, каждая из которых имеет int
. Каждый из ящиков имеет индекс, позицию в ряду ящиков. Этот индекс начинается с 0 и заканчивается на N-1, где N - размер массива (количество ящиков).
Чтобы получить одно из значений из этой серии ящиков, вы можете обратиться к нему через его индекс, например:
myArray[3]
Который даст вам значение 4-го ящика в серии (так как в первом поле есть индекс 0).
ArrayIndexOutOfBoundsException
вызвано попыткой извлечь «ящик», который не существует, передав индекс, который выше индекса последнего «поля» или отрицательный.
В моем примере работы эти фрагменты кода приведут к такому исключению:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Как избежать ArrayIndexOutOfBoundsException
Чтобы предотвратить ArrayIndexOutOfBoundsException
, необходимо рассмотреть некоторые ключевые моменты:
Looping
При переходе по массиву всегда убедитесь, что индекс, который вы извлекаете, строго меньше длины массива (количество ящиков). Например:
for (int i = 0; i < myArray.length; i++) {
Обратите внимание на <
, никогда не смешивайте там =
.
Возможно, вам захочется сделать что-то вроде этого:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Просто нет. Придерживайтесь одного выше (если вам нужно использовать индекс), и это сэкономит вам много боли.
По возможности используйте foreach:
for (int value : myArray) {
Таким образом, вы вообще не придется вообще обдумывать индексы.
Когда вы выполняете цикл, что бы вы ни делали, НИКОГДА не изменяйте значение итератора цикла (здесь: i
). Единственное место, которое должно изменить значение, это сохранить цикл. Изменение в противном случае просто рискует исключением и в большинстве случаев не является обязательным.
Retrieval / update
При извлечении произвольного элемента массива всегда проверяйте его действительность индекс по длине массива:
public Integer getArrayElement(final int index) {
if (index < 0 || index >= myArray.length) {
return null; //although I would much prefer an actual exception being thrown when this happens.
}
return myArray[index];
}
Вы также должны импортировать config.config_var, так как эта переменная принадлежит этому конкретному модулю
Вы импортируете config в util и util в config, что вызовет эту ошибку (создайте перекрестную петлю). удалите from utils import *
из config.py, а затем попробуйте это.
И в main.py вам не нужно импортировать from config import *
, если вы не используете переменные из config непосредственно в main ()
Вы создаете для многих операторов импорта, возможно, попробуйте следующее ниже, но вам также нужно определить параметр в utils.py, если вы передаете параметр через него.
В utils.py мы требуем, чтобы параметр был передан, поскольку вы хотите распечатать соответствующее значение, в config.py вы определяете значение. Тогда в main.py, как обсуждалось до использования подстановочного оператора, «*» не совсем подходит в этой ситуации, тогда для вызова соответствующих функций вам необходимо обратиться к ним через имя их файла
В utils.py :
def say_hello(config_var):
print(config_var)
В config.py
config_var = "Hello"
Затем в main.py
import config as cn
import utils as ut
ut.say_hello(cn.config_var)
В этой теме также рассказывается, как писать модули Python [ 113] Как написать модуль / пакет Python?