length=0; index=-1 at java.util.ArrayList.get(ArrayList.java:439) at io.legado.a...

2025年11月12日 16:25 状态: processing

🚨 错误信息

java.lang.ArrayIndexOutOfBoundsException: length=0; index=-1 at java.util.ArrayList.get(ArrayList.java:439) at io.legado.app.ui.book.read.page.entities.TextChapter.getReadLength(SourceFile:17) at li.v0.A(SourceFile:5) at mj.c2.onStopTrackingTouch(SourceFile:51) at android.widget.SeekBar.onStopTrackingTouch(SeekBar.java:181) at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:931) at android.view.View.dispatchTouchEvent(View.java:13699) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3249) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2938) at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:741) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:2013) at android.app.Activity.dispatchTouchEvent(Activity.java:4180) at dh.a.dispatchTouchEvent(SourceFile:6) at j.a0.dispatchTouchEvent(SourceFile:3) at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:687) at android.view.View.dispatchPointerEvent(View.java:13962) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6420) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6215) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5604) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5657) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5623) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5781) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5631) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5838) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5604) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5657) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5623) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5631) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5604) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8701) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8621) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8574) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8959) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:239) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:363) at android.os.Looper.loop(Looper.java:176) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)

🤖 AI解决方案

错误分析

1. 错误翻译



原文:java.lang.ArrayIndexOutOfBoundsException: length=0; index=-1
译文:数组索引越界异常:数组长度为0;索引值为-1

2. 原因分析


根本原因:在TextChapter.getReadLength()方法中,尝试访问一个空ArrayList的-1索引位置。

具体分析

  • ArrayList的长度为0(空列表)

  • 尝试访问索引为-1的位置(非法索引)

  • 错误发生在用户操作SeekBar停止跟踪触摸事件时
  • 3. 解决方案

    java
    // 修复方案:在访问ArrayList前添加空检查和索引合法性检查
    public int getReadLength() {
    if (yourArrayList == null || yourArrayList.isEmpty()) {
    return 0; // 返回默认值或处理空列表的情况
    }

    int targetIndex = getTargetIndex(); // 获取目标索引的方法
    if (targetIndex < 0 || targetIndex >= yourArrayList.size()) {
    return 0; // 索引越界时返回安全值
    }

    return yourArrayList.get(targetIndex).getLength(); // 安全访问
    }

    4. ️ 预防措施

    最佳实践建议

  • 防御性编程:在访问集合元素前,始终检查集合是否为空以及索引是否在有效范围内

  • 边界检查:使用index >= 0 && index < list.size()的标准模式进行索引验证
  • 开发工具推荐

  • 使用Android Studio的@Nullable注解标记可能为空的对象

  • 开启Lint检查,捕获潜在的NPE和索引越界问题