You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 03:06:22