Android: How can I find the line of MY OWN code which causes this crash?

901 Views Asked by At

I am getting the following stacktrace from a crash:

java.lang.IndexOutOfBoundsException: Invalid index 6, size is 2
   at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
   at java.util.Arrays$ArrayList.get(Arrays.java:66)
   at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:337)
   at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:390)
   at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
   at android.widget.Spinner.makeAndAddView(Spinner.java:546)
   at android.widget.Spinner.layout(Spinner.java:495)
   at android.widget.Spinner.onLayout(Spinner.java:459)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
   at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1652)
   at android.widget.TableRow.onLayout(TableRow.java:123)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
   at android.widget.TableLayout.onLayout(TableLayout.java:448)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
   at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
   at android.widget.ScrollView.onLayout(ScrollView.java:1459)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:907)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.support.v7.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:502)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663)
   at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521)
   at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
   at android.view.View.layout(View.java:14008)
   at android.view.ViewGroup.layout(ViewGroup.java:4373)
   at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
   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:5041)
   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:793)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
   at dalvik.system.NativeStart.main(NativeStart.java)

How can I find out which line of MY OWN code causes this crash?

1

There are 1 best solutions below

0
On BEST ANSWER

Some crashes will show your code in the stack trace. Others will not. One common "will not" case is a situation like this, where the crash is triggered by something that you did, but the work happens later on the main application thread.

In this case, Spinner (apparently) does not validate the selection index right away, so your call to set it did not fail. But, setting the selection adds a job to the main application thread's work queue to re-render this widget. When that happened, the selection index was invalid, and you crashed.

In an ideal world, there would be more validation up front, so you would fail on the setter and see more directly the source of your problem. And sometimes that does happen. But sometimes it will not, and you are left with a stack trace like yours. While you cannot directly point at a line in your code and say "Eureka! That's where my problem comes from!", you at least know the basics of what went wrong, and you would need to double-check recent changes you may have made that affect the crashing widget.