Я не совсем понимаю, о чем здесь говорят. Не могли бы вы дать немного больше разъяснений о том, с чем вы боретесь? Пока я здесь, я сделаю несколько конструктивных комментариев к вашему коду. Обычно StackOverflow не место для «проверки кода», хотя, как вы новичок, я надеюсь, что это окажется конструктивным, и я постараюсь дать некоторые пояснения для своих комментариев. Как новичку, определенно стоило бы проконсультироваться с некоторыми онлайн-ресурсами по основам Java, такими как CodeAcademy, w3schools или tutorialspoint.
Во-первых, важно дать переменным ясные имена - например, Item
довольно GENERI c. Вместо этого вы можете вызывать класс Question
, чтобы сразу было понятно, что этот класс представляет для любого, кто читает код.
Еще один способ сделать код понятным - включить операторы импорта в верхней части кода. , Таким образом, когда вы объявляете переменную импортированного типа, операторы в коде могут быть более краткими, например:
import java.awt.event.ActionEvent;
...
private void btnmathActionPerformed(ActionEvent evt) {
...
}
Во-вторых, стоит понять, как создаются и хранятся объекты. Стоит прочитать этот ресурс: https://www.w3schools.com/java/java_classes.asp. В качестве примера рассмотрим код ниже:
Item item1 = new Item();
item1.setID(1);
Item item2 = item;
item2.setID(2);
System.out.println("Item 1 ID: " + item1.getID());
System.out.println("Item 2 ID: " + item2.getID());
Во-первых, мы создаем новый объект класса Item
. Переменная item1
технически содержит «указатель» на местоположение этого нового объекта в памяти. Далее мы определяем item2
, однако в этом объявлении мы не создаем экземпляр нового Item
, вместо этого мы устанавливаем item2
равным item1
. Это означает, что item2
теперь содержит тот же «указатель», что и item1
, и поэтому они оба указывают на один и тот же объект в памяти! Поэтому, когда мы модифицируем item1
, мы также модифицируем item2
и наоборот.
Поэтому вышеприведенный код выводит следующее:
Item 1 ID: 2
Item 2 ID: 2
Для того, чтобы получить желаемый Поведение, мы должны убедиться, что мы создаем экземпляр нового объекта для item2
следующим образом:
Item item1 = new Item();
item1.setID(1);
Item item2 = new Item();
item2.setID(2);
System.out.println("Item 1 ID: " + item1.getID());
System.out.println("Item 2 ID: " + item2.getID());
Это будет печатать:
Item 1 ID: 1
Item 2 ID: 2
В вашем коде вы создаете экземпляр item
в внешней области видимости, и неоднократно модифицируйте этот же объект, добавляя его в ArrayList снова и снова. Это означает, что каждый элемент в вашем ArrayList
указывает на один и тот же объект с точно такими же id
, question
и category
. Поскольку вам нужно несколько различных элементов, вы должны убедиться, что каждый раз создаете новый объект.
Вам следует также стремиться объявлять переменные в максимально узкой области видимости, чтобы ограничить продолжительность их нахождения в памяти (если нет веских причин для иного). item
используется только внутри вашего while
l oop, поэтому вы должны объявить его там.
Вы также должны убедиться, что в rs
есть элементы, прежде чем пытаться их использовать. Поэтому я бы изменил ваш код следующим образом:
if (!rs.next() ) {
System.out.println("Returned ResultSet is empty!");
} else {
do {
Question question = new Question(); // Instantiate a new Question object
question.setId(rs.getInt("Id"));
question.setQuestion(rs.getString("Question"));
question.setCategory(rs.getString("Category"));
questions.add(question);
} while (rs.next());
}
Как указано выше, просьба дать дополнительные разъяснения о том, с чем вы боретесь, и я постараюсь дать ответ.