Mpandroidchart: java.lang.ArrayIndexOutOfBoundsException

Created on 13 Feb 2017  路  6Comments  路  Source: PhilJay/MPAndroidChart

Hello,

I use your library for my app. Thank you very much for your work, it looks perfect. My users reported some problems, so could you please take a look, if there is some bug in your code or am I doing something wrong? Thank you for your response.

Android 4.4, Samsung Galaxy S4 Mini
java.lang.ArrayIndexOutOfBoundsException: length=12; index=12 at myapp.GraphActivity$MyXAxisValueFormatter.getFormattedValue(GraphActivity.java:461) at com.github.mikephil.charting.components.AxisBase.getFormattedLabel(AxisBase.java:472) at com.github.mikephil.charting.components.AxisBase.getLongestLabel(AxisBase.java:458) at com.github.mikephil.charting.renderer.XAxisRenderer.computeSize(XAxisRenderer.java:79) at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxisValues(XAxisRenderer.java:74) at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxis(XAxisRenderer.java:67) at com.github.mikephil.charting.charts.BarLineChartBase.notifyDataSetChanged(BarLineChartBase.java:329) at com.github.mikephil.charting.charts.Chart.onSizeChanged(Chart.java:1691) at com.github.mikephil.charting.charts.BarLineChartBase.onSizeChanged(BarLineChartBase.java:1584) at android.view.View.sizeChange(View.java:15864) at android.view.View.setFrame(View.java:15837) at android.view.View.layout(View.java:15745) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531) at android.widget.LinearLayout.onLayout(LinearLayout.java:1440) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.ListView.setupChild(ListView.java:1905) at android.widget.ListView.makeAndAddView(ListView.java:1816) at android.widget.ListView.fillSpecific(ListView.java:1348) at android.widget.ListView.layoutChildren(ListView.java:1619) at android.widget.AbsListView.onLayout(AbsListView.java:2564) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1677) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1531) at android.widget.LinearLayout.onLayout(LinearLayout.java:1440) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453) at android.widget.FrameLayout.onLayout(FrameLayout.java:388) at android.view.View.layout(View.java:15749) at android.view.ViewGroup.layout(ViewGroup.java:4880) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2358) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2071) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1256) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6635) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) at android.view.Choreographer.doCallbacks(Choreographer.java:613) at android.view.Choreographer.doFrame(Choreographer.java:583) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5593) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method)

There is code in my app:

`public class MyXAxisValueFormatter implements IAxisValueFormatter {

    private String[] mValues;

    public MyXAxisValueFormatter(String[] values) {
        this.mValues = values;
    }

    @Override
    public String getFormattedValue(float value, AxisBase axis) {
        // "value" represents the position of the label on the axis (x or y)
        return mValues[(int) value]; // line 461
    }

}`

LineData data = new LineData(dataSets); holder.lineChart.setData(data); XAxis xAxis = holder.lineChart.getXAxis(); xAxis.setValueFormatter(new MyXAxisValueFormatter(values)); xAxis.setGranularity(1f); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setTextSize(11f); xAxis.setTextColor(getResources().getColor(R.color.TextColor)); xAxis.setDrawAxisLine(false); xAxis.setDrawGridLines(true); xAxis.setGridColor(getResources().getColor(R.color.grey300));

And there is something similar, maybe, Android 5.1, Moto G:

java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) at java.util.ArrayList.get(ArrayList.java:308) at com.github.mikephil.charting.data.DataSet.getEntryForIndex(DataSet.java:286) at com.github.mikephil.charting.utils.Transformer.generateTransformedValuesLine(Transformer.java:184) at com.github.mikephil.charting.renderer.LineChartRenderer.drawValues(LineChartRenderer.java:545) at com.github.mikephil.charting.charts.BarLineChartBase.onDraw(BarLineChartBase.java:261) at android.view.View.draw(View.java:15249) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at android.widget.ScrollView.draw(ScrollView.java:1692) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.View.draw(View.java:14977) at android.view.ViewGroup.drawChild(ViewGroup.java:3407) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3200) at android.view.View.draw(View.java:15252) at android.widget.FrameLayout.draw(FrameLayout.java:598) at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2650) at android.view.View.updateDisplayListIfDirty(View.java:14185) at android.view.View.getDisplayList(View.java:14207) at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273) at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279) at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318) at android.view.ViewRootImpl.draw(ViewRootImpl.java:2560) at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2382) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2012) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1084) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5990) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) at android.view.Choreographer.doCallbacks(Choreographer.java:580) at android.view.Choreographer.doFrame(Choreographer.java:550) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5343) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

Most helpful comment

I had this issue too, I resolved with something like this.

@Override
    public String getFormattedValue(float value, AxisBase axis) {
       int intValue = (int) value;

       if (mValues.length > intValue && intValue >= 0) return mValues[intValue];

        return "";
    }

All 6 comments

I hava a same problem
* java.lang.RuntimeException: Unable to start activity ComponentInfo{hk.demompandroidchart/hk.demompandroidchart.LineChartTestActivity}: java.lang.ArrayIndexOutOfBoundsException: length=4; index=35
*

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=4; index=35
at hk.demompandroidchart.MyXFormatter.getFormattedValue(MyXFormatter.java:21)
at com.github.mikephil.charting.components.AxisBase.getFormattedLabel(AxisBase.java:472)
at com.github.mikephil.charting.components.AxisBase.getLongestLabel(AxisBase.java:458)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeSize(XAxisRenderer.java:79)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxisValues(XAxisRenderer.java:74)
at com.github.mikephil.charting.renderer.XAxisRenderer.computeAxis(XAxisRenderer.java:67)
at com.github.mikephil.charting.charts.BarLineChartBase.notifyDataSetChanged(BarLineChartBase.java:329)
at com.github.mikephil.charting.charts.Chart.setData(Chart.java:304)
at hk.demompandroidchart.LineChartTestActivity.onCreate(LineChartTestActivity.java:56)
at android.app.Activity.performCreate(Activity.java:5385)

me too, same problem

I had this issue too, I resolved with something like this.

@Override
    public String getFormattedValue(float value, AxisBase axis) {
       int intValue = (int) value;

       if (mValues.length > intValue && intValue >= 0) return mValues[intValue];

        return "";
    }

me too,why?
sometime times is ok,but is not work mostly ,and I don't change the code

Try this:

axis.setGranularity(1f);
        axis.setValueFormatter(new IAxisValueFormatter() {
            @Override
            public String getFormattedValue(float value, AxisBase axis) {
                String val = null;
                try {
                    val = labels.get((int) value);
                } catch (IndexOutOfBoundsException e) {
                    axis.setGranularityEnabled(false);
                }
                return val;
            }
        });
Was this page helpful?
0 / 5 - 0 ratings