Ticket #81 (new defect) — at Version 1
后台Array报越界的那些事
| Reported by: | liaojunqiang | Owned by: | |
|---|---|---|---|
| Priority: | trivial | Milestone: | |
| Component: | 网友前台 | Version: | |
| Keywords: | Cc: | ||
| Due Date: | 19/01/2012 |
Description (last modified by liaojunqiang) (diff)
1.问题
线上后台有错误

2.调查
根据报错代码找到company_hot_news.jsp文件,发现如下代码很特别:
public void fixNews(List list, long nId, int pos) {
News news = EnvUtils.getEnv().getBean(NewsService.class).load(nId);
if (news != null) {
if (news.getNewsType() == 4 || news.getNewsType() == 5 || news.getNewsType() == 1) {
for (int i = 0; i < list.size(); i++) {
News newsT = (News) list.get(i);
if (news.getId() == newsT.getId() || news.getUser().getId() == newsT.getUser().getId()) {
list.remove(newsT);
}
}
} else {
System.out.println("指定的商情类型不属于优惠、新品、供应这三种类型!");
return;
}
if (news.getTitle() != null && list.size() >= pos - 1) {
list.add(pos - 1, news);
}
}
}
3.分析
List接口下有ArrayList和Vector,ArrayList不是线程安全的,而Vector是线程安全的。当然,这个如果是线程安全的话,程序不会报错,但是逻辑上有问题。如果从设计的角度去考虑,不应该改变传进去的list的值,这样做有可能遇到意想不到的事情,现在就是遇到了,这个是关键的问题。
4.解决
建多一个list,不再操作传进来的list,代码如下:
public List fixNews(List list, long nId, int pos) {
News news = EnvUtils.getEnv().getBean(NewsService.class).load(nId);
List newList = new ArrayList(list);
if (news != null) {
if (news.getNewsType() == 4 || news.getNewsType() == 5 || news.getNewsType() == 1) {
for (int i = 0; i < list.size(); i++) {
News newsT = (News) list.get(i);
if (news.getId() == newsT.getId() || news.getUser().getId() == newsT.getUser().getId()) {
newList.remove(newsT);
}
}
} else {
System.out.println("指定的商情类型不属于优惠、新品、供应这三种类型!");
return newList;
}
if (news.getTitle() != null && newList.size() >= pos - 1) {
newList.add(pos - 1, news);
}
}
return newList;
}
欢迎拍砖~
Note: See
TracTickets for help on using
tickets.
![(please configure the [header_logo] section in trac.ini)](http://www1.pconline.com.cn/global/2008/images/jss/m_logo091125.jpg)