今天维护又反馈了一问题过来,查询试卷时报数组越界异常:

 2017-02-28 10:45:24,827[ERROR] HttpException[10.32.111.7:60446:2D07867BE98F56D5EFFA1B1A597776AC]:/WAserver/HS851020 [com.hundsun.hsacct.core.httpresult.HandlerExceptionResolver.printHttpLog(HandlerExceptionResolver.java:156)]
java.lang.ArrayIndexOutOfBoundsException: 1
at com.hundsun.hsacct.action.paper.QryEligPaperAction.qryEligPaper(QryEligPaperAction.java:69)
at sun.reflect.GeneratedMethodAccessor2434.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)

看了一下开发人员写的代码,其中有两行用逗号来作为分隔符来分割字符串,基本上已经知道了问题原因。这时,心里默默想起了墨菲定律:任何事情只要存在出错的可能性,那最后肯定会出错,没出错只是因为时机未到。大师的理论果然厉害

            String answer_content = map.get("answer_content");
if (StringUtils.isNotBlank(answer_content)) {
//第一次分割,分隔符 ','
String[] stepOne = answer_content.split(",");
Map<String,String> answer = new HashMap<String,String>();
for(int i = 0; i<stepOne.length; i++)
{ //第二次分割,分隔符'、'
String[] stepTwo = stepOne[i].split("、");
//向HashMap中添加
if(answer.get(stepTwo[0])==null){
answer.put(stepTwo[0], stepTwo[1]);
}
else{
answer.put(stepTwo[0], stepTwo[1]+","+answer.get(stepTwo[0]));
} }
paper.put(Fields.ANSWER_CONTENT, answer);
} else {
paper.put(Fields.ANSWER_CONTENT, "");
}

其实之前审核代码的时候无意瞟了一眼这里,隐约感觉这段代码里面有坑,但是测试那边没测出问题,加上这个接口业务逻辑简单,所以也没当回事,结果最后快上生产了,问题还是暴漏出来了。

问题出来了,除了觉得开发人员经验不足,还有更多的是对自己的自责,毕竟开发写的代码是通过了自己的审核,为什么轻易把问题放过去了呢?

在这里对问题做一下深入分析:

IndexOutOfBoundsException(数组越界异常) 可以说是Java代码中最常见的异常之一,还有一个是NullPointerException(空指针异常)。出现的原因:对不可控的String进行split操作然后访问其中的数据是最常见的原因。 什么叫“不可控String”:来自于我们自己的程序之外的String。什么是“可控String”:来自于我们系统内部的String,比如我们代码里面定义的常量,我们系统使用的格式固定的配置文件等等。

类似的还有StringIndexOutOfBoundsException,当你对一个长度不够的字符串进行substring操作就会抛出该异常。出现该异常的原因,还是在于使用不可控String。

作为一个有经验的程序员,当看到String.split()还有String.substring()这种代码时,一定要小心谨慎。很有可能这里已经埋下了一颗定时炸弹,暂时没出现问题只是因为时机未到。

比较好的处理方式:当我们必须要对不可控String进行split()还有substring()操作时,应当进行一下检查。如果字符串不符合格式要求,我们应当主动抛出异常,让系统维护人员第一时间知道当前系统不满足运行条件,需要进行检修,从而让故障损失降到最低。

最新文章

  1. 转载---ViewPager,PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter的分析对比
  2. 解决file_get_contents无法请求https连接的方法
  3. Note_Master-Detail Application(iOS template)_03_main.m
  4. Java:异常的处理
  5. LiteHttp:一款‘智能’的HTTP框架类库
  6. iOS- iPad UIPopoverController
  7. Node安装及搭建简单服务器
  8. 设置控件Enable=false,控件颜色不变
  9. 如何使用jconsole(英文)
  10. ArcGIS导出辖区边界点坐标
  11. Unitty 3D 贪吃蛇 今日小记 -- 碰撞
  12. 【bzoj2761】[JLOI2011]不重复数字
  13. 前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例
  14. [原创] 详解云计算网络底层技术——虚拟网络设备 tap/tun 原理解析
  15. git 回滚指定行
  16. javadate相关
  17. Android中Json数据读取与创建的方法
  18. HGOI 20190217 题解
  19. jquery下的正反选操作
  20. BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点

热门文章

  1. Unity3D 4.3在Windows下打包iOS资源
  2. List&lt;T&gt;直接充当Combox控件DataSource并扩展自定义记录的方法
  3. composer 的设计原理及其基本用法
  4. Cause: java.sql.SQLException: 无效的列索引
  5. jQuery Validate自定义验证方法实现方式
  6. HTTP直接请求webService
  7. C++中使用TCP传文件
  8. saltstack系列(一)——介绍与安装
  9. SQL2005 异常处理机制(Begin try Begin Catch)
  10. 【FZU2280】Magic