为什么我一个退出登录页面都会报越界的?

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 步骤1:通过session获取登录的账号
HttpSession session = request.getSession();

Student student = (Student) session.getAttribute("student");
// 步骤2:销毁session
session.invalidate();
// 步骤3:从在线列表中移除当前登录账号
@SuppressWarnings("unchecked")
List<Integer> sidOnLineList = (List<Integer>) this.getServletContext().getAttribute("sidOnLineList");
sidOnLineList.remove(student.getSid()); // 移除
this.getServletContext().setAttribute("sidOnLineList",sidOnLineList); // 刷新在线列表
// 步骤4:页面跳转
response.sendRedirect("jsp/login.jsp");
}

}。

一只名叫tom的猫
浏览 109回答 4
4回答

BIG阳

你的代码有三个问题:1,数组越界问题 ,sidOnLineList.remove(student.getSid()); // 移除这个E remove(int index);是位置,还不是学生的号码,这直接导至这个异常。2,多线程并发问题,List<Integer> sidOnLineList 这列表如果选用非线程安全实现,那当多个用户并发登录注消就会有问题 。如果选用线程安全实现,则性能会有问题 。推荐使用ConcurrentHashMap。3,内容泄漏问题,如果用户不是主动退出(如超时或直接关掉浏览器),则会有内存溢出问题 。所以队列需要有超时或先进先出机制。

慕的地8271018

是因为存在数据,而今天没有数据了,你的数组length为0,而你还在取array[0],当然就数组下标越界了。(1)看到上述报错的第一反应是,越界了。List.size()为0,但却引用了index为0的值,并且此时List不为空。(2)那什么情况下会出现List不为null,但是List.size() == 0呢?下面给出示例:List list = new ArrayList();此时list被创建,即list不为null,但是还没有被赋值,则list.size() == 0。所以在使用List时应当同时判断(list != null && list.size() > 0)。(3)此种问题的解决方案:在使用list.get(0 ...... N)进行取值前对list和list.size()进行判断。

千万里不及你

索引越界了吧比如String[] a=new String[5]; 你调用了String[10]List list=new Arraylist();list.add("123");list.get(10)又或者String a="abc"; 你调用了a.substring(0,10)就是这些问题呗

沧海一幻觉

sidOnLineList.remove(student.getSid()); // 移除 你看一下 sidOnLineList 这个List 里面有没有东西,然后看一下student.getSid() 这个出的的什么? 要不不好判断
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
JavaScript