Что вызывает 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];
}
На странице Связанные проекты вики CouchDB в разделе «Альтернативы» упоминаются некоторые похожие проекты:
И, конечно же, Tokyo Cabinet , о котором уже упоминалось.
Также есть neo4j , который является «графической базой данных» для java.
Конечно, , часть возможностей CouchDB и некоторых других заключается не только в возможности хранить пары ключ / значение, но и в высокой емкости, репликации и, в частности, представлениях, которые в основном являются способом выполнения запросов к вашим документам.
Если вам просто нужно простое хранилище данных типа "ключ-значение", которое вы можете встроить в свою программу, в котором не должны храниться гигабайты данных, почтенный GDBM может удовлетворить ваши потребности.
A немного сложно ответить, не зная больше о ваших потребностях (язык программирования, требования параллелизма, объемы данных и т. д.).
* Веб-сайт, похоже, не работает на момент написания этой статьи.
Файловая система ОС - это облегченная база данных ключ / значение. Ключи - это имена файлов, а значения - это данные в файлах.
Слово «встраиваемый» имеет странное значение, если оно должно быть RESTful, поэтому я действительно не понимаю ваших требований; но если все, что вам нужно, это хранение и извлечение, почему бы не использовать FS?
Для какой платформы? Tokyo Cabinet - это легкий, встраиваемый, ассоциативный механизм базы данных для различных сред сценариев (Java, Ruby, Perl, Lua и др.)
Подойдет ли TinyCDB?
http://www.corpit.ru/mjt/tinycdb.html
Введение
TinyCDB - очень быстрый и простой пакет для создания и чтения постоянных баз данных, структуры данных, представленной Дэном Дж. Бернстайном в его cdb пакет. Его можно использовать для ускорения поиска в последовательности пар (ключ, значение) с очень большим количеством записей. Пример использования - индексация большого списка пользователей - где для поиска потребуется линейное чтение большого файла / etc / passwd и для многих других задач. Это' Использование / API похоже на те, которые можно найти в BerkeleyDB, gdbm и традиционных библиотеках dbm / ndbm * nix, и в значительной степени совместим с пакетом cdb-0.75 Дэна Бернштейна.
CDB - это постоянная база данных, то есть она не может быть обновлен во время выполнения, только перестроен. Перестройка - это атомарная операция, и она выполняется очень быстро - намного быстрее, чем у многих других подобных пакетов. После создания CDB может быть запрошен, и запрос занимает очень мало времени.
и запрос занимает очень мало времени. и запрос занимает очень мало времени.Простая встраиваемая база данных "ключ-значение"? Это почти что BDB
Обратите внимание на Perst - это лицензия GPLv2 и / или проприетарный, в зависимости от ваших потребностей. Никогда не пользовался, но слышал, что он хороший. Это база данных хранилища ключей и значений, встроенная в приложение, которая находится в стадии активной разработки с переносом на ряд популярных фреймворков и языков.