id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	due_date
81	后台Array报越界的那些事	liaojunqiang		"1.问题
线上后台有错误
[[Image(http://img.pconline.com.cn/images/upload/upc/tx/eyp/1201/19/c0/10239849_1326946801487_950x135.png)]]
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;
    }
}}}

欢迎拍砖~~~"	defect	new	trivial		网友前台					19/01/2012
