Stack Overflow

本文介绍了在Java编程中遇到的一些常见问题,包括空指针异常处理、do-while循环的问题、有效Java的实践、类型转换注意事项、以及面试中涉及的基础知识,如HashMap、事务特性、JVM内存模型、垃圾回收机制。文章通过具体的代码示例展示了问题的解决办法,如使用Optional避免空指针异常,以及在do-while循环中正确判断结束条件。此外,还强调了在设计时避免使用float和double,以及在选择类型时优先使用基本类型。最后,讨论了API接口的安全性措施,包括数据加密、签名、时间戳、限流和黑名单策略。
摘要由CSDN通过智能技术生成

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个主要区别:

        <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值