Странное поведение ArrayList - PullRequest
1 голос
/ 06 июня 2009

Я пишу веб-сайт с использованием JSP, JSTL, сервлетов и JavaBeans.

В одном месте моего кода я пытаюсь использовать ArrayList объектов, и происходит странная вещь: когда я добавляю первый объект, все нормально, а когда я добавляю второй объект, он добавляет его во второй место, но объект с индексом (0) получает те же значения, что и объект с индексом (1).

Возможно, проблема в

ArrayList<Article> articleList = new ArrayList<Article>();
Article newArticle = new Article();

Так как articleList является ArrayList класса Article.

Может кто-нибудь указать мне, что я делаю неправильно?

Ниже мой код:

public ArrayList<Article> getArticles()
{
    baseIO mySql = new baseIO();
    ArrayList<Article> articleList = new ArrayList<Article>();
    int articleId = 0;

    try
    {
        String sql =
            "select * from jsp_blog_article order by article_id Desc Limit 3";
        con = (Connection)mySql.getConnection();
        pstmt = (PreparedStatement) con.prepareStatement(sql);
        ResultSet rs = pstmt.executeQuery();
        while (rs.next()) {
            Article newArticle = new Article();
            newArticle.setArticleAuthor(rs.getString("article_name"));
            newArticle.setArticleBody(rs.getString("article_body"));
            newArticle.setArticleAuthor(rs.getString("article_author"));
            newArticle.setArticleDate(rs.getString("article_date"));
            articleId = Integer.parseInt(rs.getString("article_id"));
            newArticle.setArticleId(String.valueOf(articleId));
            newArticle.setArticleComments(this.getCommentsNum(articleId));
            articleList.add(newArticle);
        }
        con.close();
        pstmt.close();
    }
    catch(Exception e)
    {
        return null;
    }

    return articleList;
}

И Артикул класса

package objects;

import java.io.Serializable;

public class Article implements Serializable{
    private String articleName;
    private String articleBody;
    private String articleAuthor;
    private String articleComments;
    private String articleDate;
    private String articleId;

    public Article()
    {

    }

    // all the getters and setters in place, but it is too long
    // so i am not going to post them in forum

}

Ответы [ 5 ]

1 голос
/ 06 июня 2009

Код должен быть очищен в соответствии с другими комментариями, но функционально он должен работать.

Вот что, я думаю, происходит.

Ваш код содержит следующие две строки:

newArticle.setArticleAuthor(rs.getString("article_name"));
newArticle.setArticleAuthor(rs.getString("article_author"));

и нет соответствующего вызова:

newArticle.setArticleName(rs.getString("article_name"));

это означает, что для вашего объекта не указано имя статьи (даже если указан автор). Держу пари, что вы затем выполняете какую-то обработку, прежде чем отобразите список, который каким-то образом объединяет статьи с таким же именем.

В качестве общего подхода к отладке, я рекомендую макетировать ваш код, чтобы вы могли запустить его в отладчике и посмотреть, что на самом деле происходит (сейчас ваша система имеет так много движущихся частей, что будет трудно Вы должны отточить актуальную проблему).

В текущем случае это будет так же просто, как запустить один метод за пределами вашего веб-контейнера и использовать отладчик, чтобы посмотреть на объекты в списке, который возвращается. Вы обнаружите, что объекты в списке, действительно, являются отдельными объектами - просто имеют одно и то же свойство articleName.

1 голос
/ 06 июня 2009

Я бы попробовал так и посмотрел, что это делает.

int x = 0;
while (rs.next()) {
    articleList.add(new Article());
    articleList.get(x).setArticleName(rs.getString("article_name"));
    articleList.get(x).setArticleBody(rs.getString("article_body"));
    articleList.get(x).setArticleAuthor(rs.getString("article_author"));
    articleList.get(x).setArticleDate(rs.getString("article_date"));
    articleList.get(x).setArticleId(rs.getString("article_id"));
    articleList.get(x).setArticleComments(this.getCommentsNum(articleId));
    x++;
}
1 голос
/ 06 июня 2009

Вы дважды вызываете newArticle.setArticleAuthor ... Я знаю, что это не является частью вашей проблемы со списком, но это наблюдение.

0 голосов
/ 06 июня 2009

Добавляете ли вы статьи в базу данных одновременно с чтением? Я думаю, что в зависимости от вашего механизма хранения у вас могут возникнуть проблемы с чтением во время обновления.

0 голосов
/ 06 июня 2009

Код выглядит хорошо, как вы отображаете список, который заставляет вас думать, что в обоих индексах одинаковое значение? Возможно, ваша проблема с этим кодом.

...