这种错误,是入库时候导致的报错,具体错误还是要看在入库的时候是如何入库,导致这样的报错
就拿我出现这种错误示例:其实再找错的时候,错误可能都是不相同的,只是希望别人的出现的错误能得到借鉴
1、示例:扫描本地D:目录下的所有.xls文件
2、代码:重点画线部分
// 结尾为_1.xls文件
public void xlsCurrenF(String path){
//初始化File
File excel = new File(path);
//判断文件是否存在
if (!excel.isFile() || !excel.exists()) {
System.out.println("找不到指定的文件");
return;
}
//获取文件后缀
String suffix = excel.getName().split("\\.")[1];
// 流操作可能会出现io错误,捕获一下
try {
//根据文件后缀(xls/xlsx)进行判断初始化 工作簿
if ("xls".equals(suffix)) {
FileInputStream fis = new FileInputStream(excel); //文件流对象
wb = new HSSFWorkbook(fis);
} else if ("xlsx".equals(suffix)) {
wb = new XSSFWorkbook(excel);
} else {
System.out.println("文件类型错误!");
return;
}
//开始解析:第一个sheet页
Sheet sheet = wb.getSheetAt(0);
//第一行下标: 第一行是标题,所以不读(根据文件情况,有可能多个标题,灵活修改)
int firstRowIndex = sheet.getFirstRowNum()+3; // 第三行
//最后一行下标
int lastRowIndex = sheet.getLastRowNum()-4; // 最后一行向前推4行
// System.out.println(lastRowIndex);
// 定义LinkendList,进行添加操作,list是一整个对象可以放全局,
List
3、区间问题(用俗话来讲:入库保证map不是一个对象就行)
放for循环内,相当于每次行对象都不一样,每行7个字段,添加到数据库是对的。
放到for循环外,每次添加到list中的map对象都是一样的,这就导致插入到数据库每一条数据都一样的原因
入库for外循环区间:外循环是循环每一行,先判断行是否为空,若不为空,则进入当前行。若当前行第一个字段为空,break跳出循环(整个循环),循环内后续代码都将不会执行。此时list没有存任何数据,长度是空的。并继续执行for循环以外的代码,我这里对list长度进行了判断,长度为空,则不向数据库进行操作,用一段简短的字段提示开发者某个具体文件无数据。
出现那种错误,是由于判断行列时第一个字段为空,就会被break跳出该循环。由于没获取到数据,所以在入库时候list长度为0,没有获取到xls中数据,故在插入数据库时将空的list插入过去,这就导致在写sql遍历list,获取对应字段时候,都为空导致这样的错误。所以在此,我加了一条判断,若list的长度不为0,才可以向数据库插入数据,这样就不会出现错误了。。当然出现这样的问题我这只是其中之一,这样的报错肯定是对数据库进行操作时候所产生的错误,所以分析应该从对数据库操作那段代码开始debug调试查找问题!看代码获取到的数据结果在被传到数据库时,是否满足对数据库操作的硬性要求。就像我的,传个空list到数据库不是找难过吗?肯定要保证list有数据才能传啊!!!我这是在传授思想,希望得到借鉴。。。