墨菲定律与 IndexOutOfBoundsException(数组越界异常)
今天维护又反馈了一问题过来,查询试卷时报数组越界异常:
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()操作时,应当进行一下检查。如果字符串不符合格式要求,我们应当主动抛出异常,让系统维护人员第一时间知道当前系统不满足运行条件,需要进行检修,从而让故障损失降到最低。
墨菲定律与 IndexOutOfBoundsException(数组越界异常)的更多相关文章
- atitit.管理学三大定律:彼得原理、墨菲定律、帕金森定律
atitit.管理学三大定律:彼得原理.墨菲定律.帕金森定律 彼得原理(The Peter Principle) 1 彼得原理解决方案1 帕金森定律 2 如何理解墨菲定律2 彼得原理(The Pete ...
- 墨菲定律-Murphy's Law (转载)
墨菲定律 “墨菲定律”(Murphy's Law)亦称莫非定律.莫非定理.或摩菲定理,是西方世界常用的俚语. “墨菲定律”:事情往往会向你所想到的不好的方向发展,只要有这个可能性.比如你衣袋里有两把钥 ...
- 墨菲定律(Murphy's Law)
https://baike.baidu.com/item/墨菲定律/746284?fr=aladdin 墨菲定律是一种心理学效应,是由 爱德华·墨菲(Edward A. Murphy)提出的. 主要内 ...
- 墨菲定律&吉德林法则&吉尔伯特定律&沃尔森法则&福克兰定律
一.墨菲定律:越害怕什么,就越会发生什么 二.吉德林法则:把问题清楚地写下来,就已经解决一半了 三.吉尔伯特定律:工作中的最大问题就是没人跟你说该如何去做 四.沃尔森法则:把信息和情报排在第一位,金钱 ...
- 使用EasyPOI导入导出图片出现数组越界异常
在我使用easypoi做导出功能的时候,突然抛了一个数组越界异常,找了很久也没找到,最后猜想有可能是路径出了问题,然后打印了一下图片存放的路径,结果发现在其保存路径上存在“.”,也就是easypoi底 ...
- python3.7爬取墨菲定律保存在本地txt
#!/usr/local/bin/python3.7 # -*- coding: utf-8 -*- # @Time: 2019/07/15 # @Function 获取在线文本内容 import r ...
- C++ try catch 捕获空指针异常,数组越界异常
#include <exception> #include <iostream> using namespace std; /************************* ...
- 墨菲定律:当你觉得一个地方可能有bug,那么这个地方就会有bug----顺带了解下Tomcat那少有人注意的localhost.log
一.问题概述 题目有点长,但应该值得后端java们了解下有点小坑的localhost.log,让我长话短说. 博主是搞java后端的.后台是很简单的spring mvc + spring框架. 今天测 ...
- zookeeper命令行练习,熟练节点权限, 数组越界异常解决方案
https://www.cnblogs.com/qlqwjy/p/10517231.html zookeeper 创建持久有序节点时候报错,我的版本号是3.4.12, 亲测有效 https://blo ...
随机推荐
- 【转】Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
应用程序在运行的过程中如果需要向手机上保存数据,一般是把数据保存在SDcard中的.大部分应用是直接在SDCard的根目录下创建一个文件夹,然后把数据保存在该文件夹中.这样当该应用被卸载后,这些数据还 ...
- Access 数据库的数据类型
今天开发数据库通用组件时,做C#数据库类型与Access数据库类型的相互转化时,发现Access中“text”类型的最大长度为255,当长度超过255时,需改用“Memo”类型,但需要注意备注(Mem ...
- Spring AOP面向切面编程详解
前言 AOP即面向切面编程,是一种编程思想,OOP的延续.在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等等.在阅读本文前希望您已经对Spring有一定的了解 注:在能对代码进行添 ...
- SQL Where 字符串拼接
) set @s='1,2,3' --法一: --法二: exec('select * from tb where id in ('+@s+')')
- Autofac 4 netcore with config demo
Autofac 4+以上和以前的配置不一样的,最近在NetCore中做项目,得到实例时折腾了一番. 使用场景,用autofac实例化数据库类型,避免一个个的去new json配置文件: <?xm ...
- POJ1657
1.题目链接地址 http://poj.org/problem?id=1657 2.源代码 #include<iostream> using namespace std; int main ...
- POJ 3169 C - Layout
题意 有n头奶牛从1到n编号,按照编号顺序站成一排,有可能有多头奶牛站在同一个坐标上.一些奶牛互相喜欢,所以他们的距离不能大于某个距离,一些奶牛互相讨厌,所以他们的距离不能小于某个距离,请计算如果可能 ...
- 【HDU5187】zhx's contest
[问题描述] 作为史上最强的刷子之一,zhx的老师让他给学弟(mei)们出n道题.zhx认为第i道题的难度就是i.他想要让这些题目排列起来很漂亮. zhx认为一个漂亮的序列{ai}下列两个条件均需满足 ...
- linux下rsync命令详细整理
点评:rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一详细说明,需要了解的朋友可以参考下-在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命 ...
- SpringBoot24 SpringDataJPA环境搭建、实体类注解、关联查询
1 版本说明 JDK:1.8 MAVEN:3.5 SpringBoot:2.0.4 IDEA:旗舰版207.2 MySQL:5.5 2 SpringDataJPA环境搭建(SpringBoot版本) ...