为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只名叫tom的猫 2022-06-01 19:07:26
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:销毁sessionsession.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");}}。
查看完整描述

4 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

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

查看完整回答
反对 回复 2022-06-06
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

是因为存在数据,而今天没有数据了,你的数组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()进行判断。


查看完整回答
反对 回复 2022-06-06
?
千万里不及你

TA贡献1784条经验 获得超9个赞

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


查看完整回答
反对 回复 2022-06-06
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

sidOnLineList.remove(student.getSid()); // 移除 你看一下 sidOnLineList 这个List 里面有没有东西,然后看一下student.getSid() 这个出的的什么? 要不不好判断

查看完整回答
反对 回复 2022-06-06
  • 4 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信