Kotlin解析失败及空指针异常求助:起始日期变量抛出异常
问题分析与解决方案
可能的异常原因
SortedExpenseDateHashMap[i]返回null,你用!!强制非空触发了空指针异常:循环的i范围是0 until date,但这个HashMap的key未必是连续的0到date-1的整数,导致索引不存在时取到null。weekStart本身是null,或者格式不符合yyyy-MM-dd,调用dateFormat.parse(start)时抛出解析异常。- 强制非空断言
!!过于激进,一旦遇到null直接崩溃,没有容错空间。
修正步骤
- 替换
!!为安全调用,同时增加判空逻辑,避免空指针。 - 先校验
weekStart和weekEnd的合法性,再进行日期解析。 - 确保
SortedExpenseDateHashMap的key和循环的i匹配,或者改用遍历HashMap的entrySet来避免索引不匹配问题。
修正后的代码
if (date > 0) { // 选中周的日期数量 val dateFormat = SimpleDateFormat("yyyy-MM-dd") // 如果SortedExpenseDateHashMap的key是连续整数,先判空;否则建议遍历entrySet for (i in 0 until date) { val tv_Date = TextView(this) val sortedDateEntry = SortedDateHashMap[i] ?: continue // 交易日期不存在就跳过当前循环 val transDate = sortedDateEntry.transactionDate val sortedExpenseEntry = SortedExpenseDateHashMap[i] ?: continue // 周起止日期不存在就跳过 val start = sortedExpenseEntry.weekStart ?: continue val end = sortedExpenseEntry.weekEnd ?: continue try { val startDate = dateFormat.parse(start) ?: continue val endDate = dateFormat.parse(end) ?: continue val transactionDat = dateFormat.parse(transDate) ?: continue if (transactionDat.before(endDate) && transactionDat.after(startDate)) { setColor(tv_Date) tv_Date.setPadding(10, 15, 10, 10) tv_Date.gravity = Gravity.CENTER tv_Date.layoutParams = params3 tv_Date.text = transDate } } catch (e: ParseException) { // 捕获日期解析异常,打印日志或者做容错处理 e.printStackTrace() } } }
额外建议
- 不要在循环里重复创建
SimpleDateFormat,把它提到循环外面,避免重复初始化开销。 - 如果
SortedExpenseDateHashMap的key不是连续整数,建议改用如下遍历方式,避免索引不匹配:
for ((key, entry) in SortedExpenseDateHashMap) { // 这里用key去匹配SortedDateHashMap对应的条目 val sortedDateEntry = SortedDateHashMap[key] ?: continue // 后续逻辑同上 }
内容的提问来源于stack exchange,提问作者Habeeb
相关产品推荐
相关产品推荐

