求解决 java.lang.NullPointerException: null问题。

问题遇到的现象和发生背景

学习用项目,

从数据库查询的记录赋值给list,并通过CollectionUtils.isNotEmpty判断是否为空,但提示 java.lang.NullPointerException: null。

基础技术问题,拍砖请轻点。

问题相关代码,请勿粘贴截图
public int process(String fileUrl, String dateStr) throws IOException, ParseException {
        String minSerialno = "";
        int size = 100;
        int totalCount = 0;

        String fromDate = DateUtils.changeFormat(dateStr, DateUtils.STYLE_yyyyMMdd, DateUtils.STYLE_SIMPLE_DATE);
        String toDate = DateUtils
            .getDate(DateUtils.addDay(DateUtils.stringToDate(fromDate, DateUtils.STYLE_SIMPLE_DATE), 1), DateUtils.STYLE_SIMPLE_DATE);

        logger.info("fromDate{},toDate{}", fromDate,toDate);

//        writeHeadToFile(fileUrl);
        List<AdmFiveClassApplyTransactionRecordEntity> tradeRecords;
        while (CollectionUtils.isNotEmpty(tradeRecords = fiveClassApplyTransactionRecordMapper.selectFiveClassRecordsSecond(minSerialno, size, fromDate, toDate))) {
            writeToFile(fileUrl, tradeRecords, true);
            minSerialno = tradeRecords.get(tradeRecords.size() - 1).getSerialno();
            totalCount += tradeRecords.size();
        }
        return totalCount;
    }

函数selectFiveClassRecordsSecond(minSerialno, size, fromDate, toDate)定义如下:

/**
     * 获取五级分类调整记录
     *
     * @param minSerialno
     * @param size
     * @param fromDate
     * @param toDate
     * @return
     */
    List<AdmFiveClassApplyTransactionRecordEntity> selectFiveClassRecordsSecond(@Param("minSerialno") String minSerialno, @Param("size") int size, @Param("fromDate") String fromDate, @Param("toDate") String toDate);

mapper.xml定义如下:

  <select id="selectFiveClassRecordsSecond" resultMap="BaseResultMap">
    select *
    from adm_five_class_apply_transaction_record
    <where>
      adjust_status = '1'
      <if test="minSerialno != null and serialNo != ''">
       and serialno > #{minSerialno, jdbcType=VARCHAR}
      </if>
<!--      <if test="fromDate != null and fromDate != ''">-->
<!--        and submit_time >= #{fromDate,jdbcType=TIMESTAMP}-->
<!--      </if>-->
<!--      <if test="toDate != null and toDate != ''">-->
<!--        and submit_time &lt; #{toDate,jdbcType=TIMESTAMP}-->
<!--      </if>-->
    </where>
    order by serialno asc limit #{size}
  </select>


运行结果及报错内容

代码执行报错,提示scheduled task java.lang.NullPointerException: null
2022-04-01 at 17:13:00 CST ERROR org.springframework.scheduling.support.TaskUtils$LoggingErrorHandler 95 handleError - Unexpected error occurred in scheduled task java.lang.NullPointerException: null
at cn.webank.eacds.task.ExportFiveClassRecordTask.process(ExportFiveClassRecordTask.java:94) ~[main/:?]
at cn.webank.eacds.task.ExportFiveClassRecordTask.handleExecute(ExportFiveClassRecordTask.java:75) ~[main/:?]
at cn.webank.eacds.task.ExportFiveClassRecordTask.execute(ExportFiveClassRecordTask.java:56) ~[main/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) ~[spring-context-5.2.9.RELEASE.jar:5.2.9.RELEASE]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_91]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_91]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_91]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[?:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[?:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_91]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]

我的解答思路和尝试过的方法
我想要达到的结果

空值时应该能够正常处理才对。

报错信息已经提示了 报错的文件和行号
ExportFiveClassRecordTask.java:94

代码截图都没有显示这个行号 看看ExportFiveClassRecordTask.java 的第 94行 这行报空指针呢?

打断点,debug模式走一下,看下tradeRecords这个集合是否为null,导致调用tradeRecords.get(tradeRecords.size() - 1).getSerialno();和tradeRecords.size()方法时出错

img


使用了debug,是在101行出的问题,但99行打印的fiveClassParamEntity.getApplySerialno()为空。是不是跟注解有什么关系。