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

ArrayList.add()时报越界异常

ArrayList.add()时报越界异常

尚方宝剑之说 2019-03-28 18:15:57
今天遇到几个很诧异的越界异常:List cmds = TerminalMaps.terminal_commands.get(mac);if (cmds == null){cmds = new ArrayList();}StringBuffer command = new StringBuffer();command.append(Constant.CMD_START).append("register_response").append(Constant.CMD_ITEM_TOKENIAER).append("ok");cmds.add(command.toString()); //在这一行报了个java.lang.ArrayIndexOutOfBoundsException: -1还有一个remove时越界异常:while (cmdList.size() > 0){String cmd = cmdList.remove(0); //这儿也报越界异常}这两个越界异常的诡异极了, 而且很难重现.当我以为只是幻觉的时候, 他又时不时蹦出来恶心我一把.请大家指教.
查看完整描述

4 回答

?
慕莱坞森

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

还有一个remove时越界异常:
while (cmdList.size() > 0){
String cmd = cmdList.remove(0); //这儿也报越界异常

第一次进入while存在0的元素是没问题的,当第二次进入0的元素已经被移除。所以会有
越界异常

查看完整回答
反对 回复 2019-04-26
?
偶然的你

TA贡献1841条经验 获得超3个赞

只有两种可能会引起这种情况:
1。多线程的并发访问导致的,需要有外部同步机制。
2。List cmds可能是List的特殊实现,检查它的类型。

查看完整回答
反对 回复 2019-04-26
?
HUX布斯

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

第一个问题:
ArrayList.add不会报越界异常, 最多堆OutOfMemory,你这里
[code="java"]List cmds = TerminalMaps.terminal_commands.get(mac); [/code] ,起作用的应该是这句吧,看看这个怎么实现的。

第二个问题:
并发情况下,有可能发生这个问题,2个线程都进入了while循环,结果第2个remove(0)的就会报越界异常。


查看完整回答
反对 回复 2019-04-26
  • 4 回答
  • 0 关注
  • 750 浏览

添加回答

举报

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