【问题标题】:How to debug Android java.lang.IndexOutOfBoundsException HeaderViewListAdapter.java line如何调试Android java.lang.IndexOutOfBoundsException HeaderViewListAdapter.java 行
【发布时间】:2016-04-02 11:10:15
【问题描述】:

我有一个应用在 android playstore 中,我最近开始看到来自 Crashlytics 的崩溃报告,并带有以下跟踪:

Fatal Exception: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
   at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
   at java.util.ArrayList.get(ArrayList.java:304)
   at android.widget.HeaderViewListAdapter.isEnabled(HeaderViewListAdapter.java:164)
   at android.widget.ListView.dispatchDraw(ListView.java:3259)
   at android.view.View.draw(View.java:14183)
   at android.widget.AbsListView.draw(AbsListView.java:4960)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.draw(View.java:14183)
   at android.widget.FrameLayout.draw(FrameLayout.java:467)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.getDisplayList(View.java:13116)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:1229)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.draw(View.java:14183)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.draw(View.java:14183)
   at android.widget.FrameLayout.draw(FrameLayout.java:467)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.draw(View.java:14183)
   at android.support.v7.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:500)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.getDisplayList(View.java:13116)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.getDisplayList(View.java:13116)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.View.draw(View.java:13896)
   at android.view.ViewGroup.drawChild(ViewGroup.java:3024)
   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2893)
   at android.view.View.draw(View.java:14183)
   at android.widget.FrameLayout.draw(FrameLayout.java:467)
   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2449)
   at android.view.View.getDisplayList(View.java:13118)
   at android.view.View.getDisplayList(View.java:13162)
   at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1198)
   at android.view.ViewRootImpl.draw(ViewRootImpl.java:2431)
   at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2303)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2109)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1179)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4859)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
   at android.view.Choreographer.doCallbacks(Choreographer.java:562)
   at android.view.Choreographer.doFrame(Choreographer.java:532)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
   at android.os.Handler.handleCallback(Handler.java:725)
   at android.os.Handler.dispatchMessage(Handler.java:92)
   at android.os.Looper.loop(Looper.java:137)
   at android.app.ActivityThread.main(ActivityThread.java:5328)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:511)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
   at dalvik.system.NativeStart.main(NativeStart.java)

我的应用程序有很多屏幕和视图,从这个跟踪中没有来自我的应用程序的框架:(我如何确定从哪里开始查找?非常感谢任何指针。

【问题讨论】:

  • 这意味着你的ArrayListarrayempty 无论你传入HeaderViewListAdapter.java
  • 您的分析是否报告在该错误之前加载了哪个活动?您的代码中是否有很多地方都有 HeaderViewListAdapter?
  • 您的 HeaderViewListAdapter.isEnabled 方法通过不检查它是否分析给定数组的正确索引而引发异常。添加一些检查以确保它是有效的索引值
  • 你有解决这个问题的办法吗?我也面临同样的问题,无法找到任何解决方案。
  • 虽然我没有使用任何 HeaderViewListAdapter,但遇到了同样的问题

标签: java android exception


【解决方案1】:

覆盖 getHeadersCount() 并在数据大小为 0 时始终返回 0。

@Override
public int getHeadersCount(){
  return getCount() == 0 ? 0 : super.getHeaderCount();
}

当您有非空数据列表并尝试访问 0 元素时会发生这种情况。

您可能还需要对 isEnabled() 方法执行相同的操作

@Override
public boolean isEnabled(int position){
  return position > 0 || getHeadersCount() > 0 ? super.isEnabled(position) : false;
}

【讨论】:

  • 覆盖哪里?
  • @m0skit0 在适配器中覆盖。您需要创建一个类来扩展您的适配器并覆盖此方法。
【解决方案2】:

在使用带有 ListView 的自定义适配器时,我遇到了同样的异常。并且从 Android 标准库类中抛出了异常,甚至没有导致我的任何代码行。 我还添加了 Header,所以我的适配器被 HeaderViewListAdapter 隐式包装。 就我而言,当我从适配器中删除数据时会出现问题。

我在想问题是因为 ListView 或适配器不能与 Header 一起正常工作,但实际上原因是其他的。

我的解决方案是确保适配器的数据永远不会从其他线程更改,并且从 UI 线程调用 notifyDataSetChanged()

所以,修复后一切正常,我的代码如下所示:

// Loader's callbacks
@Override
public Loader<...> onCreateLoader(int id, Bundle args) {
    return new Loader...
}

@Override
public void onLoadFinished(Loader<...> loader, Data data) {
    ...
    // adapter's list of items
    listItems.clear();
    listItems.addAll(data);
    adapter.notifyDataSetChanged();
    ...
}

@Override
public void onLoaderReset(Loader<List<? extends Map<String, ?>>> loader) {
    ...
}

// custom loader 
private static class ContactAsyncLoader extends AsyncTaskLoader<...> {
    @Override
    public List<..> loadInBackground() {
        Data data = new ..
        ...
        return data;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    相关资源
    最近更新 更多