Android中存储毫秒时间时触发数组越界异常问题排查
问题原因分析
你触发ArrayIndexOutOfBoundsException的核心错误是误用了Calendar.get()方法:
Calendar.get(int field)方法需要传入Calendar类定义的常量(比如Calendar.HOUR_OF_DAY、Calendar.MINUTE),用来获取对应字段的值;- 你直接传入了小时数值
h和分钟数值m,当h≥10时,这个数值超过了Calendar内部字段数组的最大索引(数组长度为17,索引范围0-16),所以抛出越界异常。
修正后的代码
把错误的calendar.get(h)和calendar.get(m)替换为Calendar.set()方法,用来设置选中的小时和分钟:
picker.addOnPositiveButtonClickListener { val h = picker.hour val m = picker.minute binding.timeStart.text = "$h:$m" Timber.d("Start Time - h: $h m: $m") try { val calendar = Calendar.getInstance() // 设置小时(24小时制用HOUR_OF_DAY,12小时制需搭配AM_PM字段) calendar.set(Calendar.HOUR_OF_DAY, h) // 设置分钟 calendar.set(Calendar.MINUTE, m) // 可选:将秒和毫秒置为0,避免当前时间的秒/毫秒干扰 calendar.set(Calendar.SECOND, 0) calendar.set(Calendar.MILLISECOND, 0) val timeInMilliSeconds = calendar.timeInMillis Timber.d("$timeInMilliSeconds") } catch (e: Exception) { Timber.d("$e") } }
更优实现方式(推荐)
Calendar是Java旧版的日期时间API,容易出错且可读性差,推荐使用Java 8+的LocalTime配合Instant来转换毫秒值(Android API 26+直接支持,低版本可引入ThreeTenABP库兼容):
picker.addOnPositiveButtonClickListener { val h = picker.hour val m = picker.minute binding.timeStart.text = "$h:$m" Timber.d("Start Time - h: $h m: $m") // 创建LocalTime实例 val localTime = LocalTime.of(h, m) // 转换为当天该时间的毫秒值(基于系统默认时区) val timeInMilliSeconds = localTime.atDate(LocalDate.now()) .atZone(ZoneId.systemDefault()) .toInstant() .toEpochMilli() Timber.d("$timeInMilliSeconds") }
内容的提问来源于stack exchange,提问作者oyeraghib
相关产品推荐
相关产品推荐

