2009-06-06 15 views
1

JSP, JSTL, Servlets 및 JavaBeans를 사용하여 웹 사이트를 작성하고 있습니다.ArrayList의 이상한 동작

내 코드의 한 지점에서 객체의 ArrayList를 사용하려고하는데 이상한 일이 일어났습니다. 첫 번째 객체를 추가하면 두 번째 객체를 추가 할 때 객체가 추가됩니다. 두 번째 자리에 있지만 인덱스 (0)의 객체는 인덱스 (1)의 객체와 동일한 값을 가져옵니다. articleList이 제 클래스의 ArrayList를이기 때문에

은 어쩌면 문제는

ArrayList<Article> articleList = new ArrayList<Article>(); 
Article newArticle = new 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 

} 
+0

먼저 articleId를 구문 분석 한 다음 즉시 다시 문자열로 변환해야하는 특별한 이유가 있습니까? –

+0

getArticles() 메서드를 복사하여 붙여 넣거나 실제 코드가 약간 다릅니 까? 코드와 Soldier.moth의 코드간에 기능상의 차이가 없어야하기 때문입니다. 그는 매번 새로운 Article 객체를 생성합니다. –

+0

사실 내 코드가 왜 돌아 가지 않았는지 모르겠다. –

답변

1

나는이 방법으로 시도하고 이것이 무엇을하는지 봅니다.

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

지적 해 주셔서 감사합니다! 그러나 나는 이유를 모르겠다. 이유를 설명해 주시면 감사하겠습니다. – Dmitris

+0

이렇게하면 매번 별개의 기사 개체를 작업 할 때마다 동일한 작업을 수행하는 것과 달리 동일한 개체를 참조하는 것이므로 두 번째로 변경하면 첫 번째 개체도 변경됩니다. –

+3

어, 아니. 이 방법은 첫 x ​​째 f}과 동일해야합니다. 단, 모든 setXXX 메소드의 목록에서 아티클을 검색하는 데 추가되는 오 v 헤드는 제외됩니다. –

1
당신은 두 번 newArticle.setArticleAuthor를 호출

... 나는이 목록의 문제의 일부가 아닌 건 알지만 즉 관찰.

+0

그게 내가 고쳤다. – Dmitris

0

코드는 괜찮습니다. 같은 값이 두 색인에 있다고 생각하게 만드는 목록을 어떻게 표시합니까? 아마도 문제는 그 코드와 관련이 있습니다.

+0

나는 그것을 디버그하고 내 자신의 눈으로 그것이 런타임에 어떻게 변하는 지 알았다. – Dmitris

0

기사를 읽는 동안 동시에 기사를 데이터베이스에 추가하고 있습니까? 스토리지 엔진에 따라 업데이트가 진행되는 동안 읽을 때 문제가 발생할 수 있다고 생각합니다.

+0

mysql을 사용하고 있습니다. 나는 그것을 읽는 동안 업데이트하지 않습니다. 방금 ​​읽은 후 디스플레이 – Dmitris

1

코드는 다른 주석에 따라 정리해야하지만 기능적으로 작동해야합니다.

여기 내가 생각하는 바가 있습니다.

코드는 그 안에 다음 두 줄이 있습니다

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

및 해당하는 호출에 없다 :

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

이 개체가 지정되지 문서 이름을 (심지어 생각이 없다는 것을 의미한다 저자가 지정됨). 같은 이름의 기사를 어떻게 든 병합하는 목록을 표시하기 전에 어떤 종류의 처리를하고 있다고 생각합니다.

디버깅에 대한 일반적인 접근 방식으로 디버거에서 실행하고 실제로 진행되는 작업을 볼 수 있도록 코드를 조롱하는 것이 좋습니다 (지금 당장 시스템에는 많은 이동 부품이있어 어려울 것입니다 당신이 실제 문제에 집중할 수 있도록).

현재로서는 웹 컨테이너 외부에서 하나의 메서드를 실행하고 디버거를 사용하여 반환 된 목록의 객체를 살펴 보는 것만 큼 간단합니다. 목록에있는 객체는 실제로는 별도의 객체이며 동일한 articleName 속성 만 갖는 것입니다.

+0

setArticleName 코드를 게시 한 직후에 이미 수정되었습니다. 응용 프로그램은 블로그 웹 사이트이며 데이터베이스에서 데이터를 읽은 다음 주 페이지에 jstl foreach로 표시하려고했습니다. – Dmitris

+0

그리고 디버거에서 정지 지점을 수행하면 목록의 레코드는 어떻게 생겼을까요? 군인. 그 해결책은 당신과 다르지 않아야합니다 (효율성이 떨어지고 코드가 불안정하지 않은 것 외). 겪고있는 문제를 실제로 이해하는 것이 중요합니다. –