2020-08-13:空指针异常
-
通过optional语法糖处理:由于未对deviceRtu.getLampNum()进行空值处理
//批量插入device_lamp if (!CollectionUtils.isEmpty(deviceLamps)) { enhancedDeviceLampMapper.batchInsertLamps(deviceLamps); logger.info("批量新增单灯控制器成功!"); DeviceRtu deviceRtu = enhancedDeviceRtuMapper.selectByPrimaryKey(deviceId); // int oldLampNum = Objects.isNull(deviceRtu.getLampNum()) ? 0 : deviceRtu.getLampNum(); /*修改前代码 deviceRtu.setLampNum(deviceRtu.getLampNum() + deviceLamps.size()); //上面一行代码在deviceRtu对象的lampNum字段为空时,会触发NullPointException错误 */ Integer oldLampNum = Optional.ofNullable(deviceRtu.getLampNum()).orElse(0); deviceRtu.setLampNum(oldLampNum + deviceLamps.size()); enhancedDeviceRtuMapper.updateByPrimaryKey(deviceRtu); }
-
由于打印日志不规范,上述空指针异常导致了“The last packet successfully received from the server was 1,266,537 milliseconds ago. The last pack"错误,误导了排查方向。正确的打印堆栈信息的格式为:
try { res = parseExcel(deviceId, workBook); } catch (Exception e) { logger.error("parse excel failure,the error message is:{}", e.getMessage(), e); }
2020-08-14:do-while循环问题
-
实时报警—全部导出
PageRequest pageRequest = new PageRequest(); pageRequest.setPageNo(1); //首次查询页码 pageRequest.setPageSize(500);//每次查询的条数 request.setPageRequest(pageRequest); PageInfo<DeviceRTUAlarmHistory> pageInfo = null; String fileName = null; try { pageInfo = irtuAlarmService.getHistoryAlarm(request); long total = pageInfo.getTotal(); if (total >= 20_000) { LOGGER.error("ExportAllHisTimeAlarmToExcel Error; ExportData Size More Than 20000; "); return; } fileName = new String(("智慧照明历史报警信息_" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH时mm分ss秒")) + ".xlsx") .getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); try { fileName = URLEncoder.encode(fileName, "UTF-8"); } catch (UnsupportedEncodingException e) { LOGGER.error("ExportAllHisTimeAlarmToExcel Error; ErrorMsg = ", e); throw e; } } catch (Exception e) { LOGGER.error("ExportAllHisTimeAlarmToExcel Error; ErrorMsg = ", e); try { response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "INTERNAL SERVER ERROR"); } catch (IOException ex) { LOGGER.error("ExportAllHisTimeAlarmToExcel Error; Response SendError Error; ErrorMsg = ", e); } return; } try (ServletOutputStream out = response.getOutputStream()) { ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true); try { Sheet sheet1 = getSheet(response, fileName); do { List<RTUWarningDetailExcelPOJO> collect = pageInfo.getList().stream() .map(RTUWarningDetailExcelPOJO::new) .collect(Collectors.toList()); writer.write(collect, sheet1); pageRequest.setPageNo(pageRequest.getPageNo() + 1); request.setPageRequest(pageRequest); pageInfo = irtuAlarmService.getHistoryAlarm(request); } while (pageInfo.isHasNextPage()); } finally { writer.finish(); out.flush(); } LOGGER.info("ExportAllHisTimeAlarmToExcel End;"); } catch (Exception e) { LOGGER.error("ExportAllHisTimeAlarmToExcel Error; ErrorMsg = ", e); }
-
当导出的记录条数超过500条时,do-while循环的判断条件pageInfo.isHasNextPage()在最后一页为false,导致do循环的write方法少执行了一次,最后一页数据无法导出。
-
应该修改为while (pageRequest.getPageNo() <= pageInfo.getPages() + 1);
-
2020-08-20:再读effective-java
-
避免使用float,double类型进行字段你的设计和存储,他们没有提供精确的结果,所以要避免使用在需要精确结果的场合
-
需要精确结果的场合使用BigDecimal对象。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法,方法中的参数也必须是BigDecimal的对象 。
-
如果数值范围没有超过9为十进制数字,使用int;如果超过9位但不超过18位数字,可以使用long;如果有可能超过18位数字,就必须使用BigDecimal
-
基本类型优于装箱类型
-
基本类型和装箱类型主要有3个主要区别:
-
<
-