2009-06-06 7 views
1

J'écris un site Web en utilisant JSP, JSTL, Servlets et JavaBeans. À un point de mon code, j'essaie d'utiliser une ArrayList d'objets, et une chose étrange se produit: quand j'ajoute le premier objet, c'est bien, et quand j'ajoute un second objet, il l'ajoute dans le deuxième place, mais l'objet à l'index (0) obtient les mêmes valeurs que l'objet à l'index (1).Comportement étrange de ArrayList

Peut-être un problème est dans le

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

Depuis articlelist est ArrayList de l'article classe. Est-ce que quelqu'un peut me signaler ce que je fais mal?

est mon code ci-dessous:

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; 
} 

Et l'article classe

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 

} 
+0

Une raison particulière pour laquelle vous commencez par analyser articleId et ensuite le convertir immédiatement en chaîne? –

+0

Avez-vous copié et collé la méthode getArticles(), ou votre code réel est-il légèrement différent? Parce qu'il ne devrait pas y avoir de différence fonctionnelle entre votre code et le code de Soldier.moth. Vous créez un nouvel objet article à chaque fois, comme il est. –

+0

Je suis en fait curieux à ce sujet aussi, parce qu'en regardant en arrière je ne suis pas sûr pourquoi mon code a fonctionné où le vôtre n'a pas fait. –

Répondre

1

Je voudrais l'essayer de cette façon et voir ce que cela fait.

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++; 
} 
+0

Ca marche !!! Mais je ne comprends pas pourquoi. J'apprécierais vraiment si vous pouvez expliquer pourquoi. – Dmitris

+0

Lorsque vous le faites de cette façon, vous travaillez à chaque fois sur un objet Article distinct, alors que vous faisiez référence au même objet lorsque vous le changiez la deuxième fois que vous changiez le premier. –

+3

Euh, non. Cette façon de procéder devrait être identique à la première, à l'exception de l'ajout de l'extraction de l'article de la liste sur chaque méthode setXXX. –

1

Vous appelez newArticle.setArticleAuthor deux fois ... Je sais que ce ne fait pas partie de votre problème de liste, mais est une remarque.

+0

Celui-là j'ai corrigé. Merci de m'avoir signalé – Dmitris

0

Le code a l'air bien, comment affichez-vous la liste qui vous fait penser que la même valeur est aux deux index? Votre problème est peut-être lié à ce code.

+0

Je l'ai débogué et j'ai vu de mes propres yeux comment cela change dans le temps d'exécution. – Dmitris

0

Ajoutez-vous des articles à la base de données en même temps que vous les lisez? Je pense qu'il est possible, en fonction de votre moteur de stockage, que vous ayez des problèmes de lecture pendant la mise à jour.

+0

J'utilise mysql. Non, je ne suis pas en train de le mettre à jour en le lisant. Je viens de le lire et d'afficher – Dmitris

1

Le code doit être nettoyé par les autres commentaires, mais fonctionnellement, cela devrait fonctionner.

Voici ce que je pense qui se passe.

Votre code a les deux lignes suivantes dans ce:

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

et il n'y a pas d'appel correspondant à:

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

cela signifie que votre objet n'a pas de nom de l'article spécifié (même si le auteur est spécifié). Je parie que vous êtes en train de faire une sorte de traitement avant de afficher la liste qui fusionne en quelque sorte les articles avec le même nom. Comme approche générale du débogage, je vous recommande de simuler votre code pour pouvoir l'exécuter dans un débogueur et voir ce qui se passe réellement (en ce moment, votre système a tellement de pièces mobiles que ça va être difficile pour que vous puissiez vous concentrer sur le problème réel).

Dans le cas présent, ce serait aussi simple que d'exécuter la méthode one en dehors de votre conteneur Web et d'utiliser un débogueur pour examiner les objets de la liste qui sont retournés. Vous constaterez que les objets dans la liste sont, en effet, des objets séparés - ayant juste la même propriété articleName.

+0

Le setArticleName que j'ai déjà corrigé presque immédiatement après que j'ai posté du code ici. L'application est un site Web de blog et j'essayais juste de lire les données de la base de données et ensuite l'afficher avec jstl foreach sur la page principale. – Dmitris

+0

Et si vous faites un point d'arrêt dans le débogueur, à quoi ressemblent les enregistrements de la liste? La solution de soldier.moth ne devrait pas être différente de la vôtre (autre que d'être moins efficace et le code étant peu évolué). Il est probablement très important de vraiment comprendre le problème que vous rencontrez. –