[英]Strange behaviour of ArrayList
我正在使用JSP,JSTL,Servlet和JavaBeans编写网站。
在代码的某一时刻,我试图使用对象的ArrayList,这发生了一件奇怪的事情:当我添加第一个对象时,这很好,而当我添加第二个对象时,将其放在第二位,但是索引(0)处的对象与索引(1)处的对象具有相同的值。
也许问题出在
ArrayList<Article> articleList = new ArrayList<Article>();
Article newArticle = new Article();
由于articleList是Article类的ArrayList。
有人可以指出我做错了什么吗?
下面是我的代码:
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
}
您两次调用newArticle.setArticleAuthor ...我知道这不是列表问题的一部分,但这是一个观察。
我会用这种方式尝试一下,看看能做什么。
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++;
}
该代码应根据其他注释进行清理,但从功能上讲,它应该可以工作。
我认为这是正在发生的事情。
您的代码包含以下两行:
newArticle.setArticleAuthor(rs.getString("article_name"));
newArticle.setArticleAuthor(rs.getString("article_author"));
并且没有相应的调用:
newArticle.setArticleName(rs.getString("article_name"));
这意味着您的对象没有指定文章名称(即使指定了作者)。 我敢打赌,在显示列表以某种方式合并具有相同名称的列表之前,您将先进行某种处理。
作为一般的调试方法,我建议您模拟代码,以便可以在调试器中运行它,并查看实际发生的情况(现在,系统中有很多活动部件,因此很难进行磨练在实际问题上)。
在当前情况下,这就像在Web容器外部运行一个方法,然后使用调试器查看要返回的列表中的对象一样简单。 您会发现列表中的对象确实是单独的对象-只是具有相同的articleName属性。
代码看起来不错,您如何显示使两个索引都具有相同值的列表? 也许您的问题在于该代码。
您是否在阅读文章的同时将文章添加到数据库? 我认为根据更新的存储方式,您可能会在阅读时遇到问题,具体取决于您的存储引擎。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.