#java #object #arraylist
Вопрос:
У меня есть класс А, который является родительским классом. Тогда у меня есть неизвестный набор классов (назовем их B, C, D и т.д.), Которые являются дочерними классами A. В качестве общей переменной все объекты A имеют переменную int, определяемую в качестве параметра. В другом классе мне нужно написать код, который обращается к экземплярам B, C, D и т. Д. которые указаны Пользователем. Код манипулирует, считывает и иным образом работает с этими объектами, чтобы позже отобразить их в таблице J. Я начал с определения списка массивов в области:
ArrayList<A> theArrayList = new ArrayList<>();
int wealth = (some code that defines the int);
позже я запускаю следующий код в конструкторе:
while (this.theArrayList.size() == 0) {
int i = 0;
while (this.theArrayList.toArray().length > i) {
for (A a : this.theArrayList) {
if (a.price > this.wealth) {
this.anArrayListOfAFromPreviousCodeBlock.add(a);
}
int randomIndex = (int) (Math.random() *
this.anArrayListOfAFromPreviousCodeBlock.toArray().length);
if (this.anArrayListOfAFromPreviousCodeBlock.size() == 0) {
JOptionPane.showMessageDialog(null, "Array length is 0!");
}
//Error source
this.thisArrayList.add(this.anArrayListOfAFromPreviousCodeBlock.get(randomIndex));
}
i ;
}
оба блока, как ArrayList, так и anArrayListOfAFromPreviousCodeBlock, определены в одном и том же формате:
//in the scope of the class:
ArrayList<A> theArrayList;
ArrayList<A> anArrayListOfAFromPreviousCodeBlock;
//later in the constructor:
this.theArrayList = new ArrayList<>();
this.anArrayListOfAFromPreviousCodeBlock = new ArrayList<>();
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю этот код, я получаю «Исключение IndexOutOfBoundsException: Индекс 0, размер 0» в отмеченной строке.
Если я правильно это интерпретирую, этот.этот список всегда имеет размер 0. Я инициализирую его, но он все равно остается пустым. Я добавил условие в первую строку второго блока кода, но это приводит к бесконечному циклу, а не к решению. Поскольку речь идет о случайной случайности, я думал, что мне не повезло, и список просто всегда был пуст.
Но поскольку он вообще не может быть заполнен, невозможно, я обнаружил, что это может быть связано с несовместимыми типами данных в списке массивов. Поскольку я создал код для работы с As, а не с детьми A, может возникнуть проблема.
Я не уверен, как дальше подойти к этой проблеме. Каким-то образом мне нужно сохранить неизвестное количество объектов неизвестного числа типов данных в списке массивов. Я бы использовал обычный массив, но список массивов неизвестен и, возможно, изменяется по размеру.
Но мне все еще нужно, чтобы он отображал данные в J-таблице позже.
В соответствии с просьбой позвольте мне объяснить, что должен делать код: как я уже сказал, у меня есть несколько подклассов от A. И программа создает неизвестное количество объектов этих подклассов. Цель этого блока кода состоит в том, чтобы проверить каждое значение A и взять его цену, чтобы проверить, больше ли оно этого.богатство. Объект, на котором я использую этот метод, имеет богатство, и богатство-это int, определенный выше. Если это будет сделано, объект будет добавлен в список массивов в строке 6 приведенного выше кода. Затем я делаю что-то еще с элементами в этом массиве в случайном порядке, чтобы избежать смещения. Вот почему я беру случайный индекс. По соображениям безопасности и чтобы не потерять данные при повторении этого цикла, я добавляю все выбранные элементы в новый список массивов. Этот список массивов, как только код будет полностью завершен, будет отображаться с помощью JTable.
Комментарии:
1. Проверьте размер
anArrayListOfAFromPreviousCodeBlock
. Если вы используете ide, используйте известный инструмент под названием Debugger.2. Разве я не сделал это с помощью цикла while? Я проверил это несколько раз в разных условиях. Если цикл реализован, он будет выполняться непрерывно. если нет, я получу сообщение об ошибке.
3. Внешний цикл выполняется, если
theArrayList.size == 0
. Внутренний цикл выполняется, еслиtheArrayList.size > i
(размер уже установлен как 0 иi
инициализирован как 0, поэтому циклы немедленно заканчиваются). Это никогда ничего не должно делать… Сообщение об исключении ясно — вы пытаетесь получить доступ к элементу 0 в пустом списке (т. Е. Элементов нет, поэтому в 0 ничего нет). Я не уверен, чего вы пытаетесь достичь с помощью этих циклов — можете ли вы объяснить на естественном языке или псевдокодировать, что пытается сделать этот блок? ТакthisArrayList
и должно бытьtheArrayList
?4. Я добавил абзац, объясняющий, что делает код.
5. @GalliadII насколько я понимаю ваш код, вы не проверяете размер anArrayListOfAFromPreviousCodeBloc, что бы это ни было… Метод get вызывается извне из предыдущего условия if.