Ticket #81 (new defect) — at Version 1

Opened 14 years ago

Last modified 14 years ago

后台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.问题
线上后台有错误
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;
    }

欢迎拍砖~

Change History

comment:1 Changed 14 years ago by liaojunqiang

  • Description modified (diff)
Note: See TracTickets for help on using tickets.