PhilJay/MPAndroidChart · error · RuntimeException

You need to set data for the chart before grouping bars.

Error message

You need to set data for the chart before grouping bars.

What it means

Thrown by BarChart.groupBars() when the chart has no BarData set yet. Grouping bars requires repositioning entries across BarDataSets, so it cannot run before data is attached. The guard is getBarData() == null checked before delegating to getBarData().groupBars(). It is an unguarded RuntimeException, so it crashes the app unless the caller guards it.

Source

Thrown at MPChartLib/src/main/java/com/github/mikephil/charting/charts/BarChart.java:252

     */
    public void setFitBars(boolean enabled) {
        mFitBars = enabled;
    }

    /**
     * Groups all BarDataSet objects this data object holds together by modifying the x-value of their entries.
     * Previously set x-values of entries will be overwritten. Leaves space between bars and groups as specified
     * by the parameters.
     * Calls notifyDataSetChanged() afterwards.
     *
     * @param fromX      the starting point on the x-axis where the grouping should begin
     * @param groupSpace the space between groups of bars in values (not pixels) e.g. 0.8f for bar width 1f
     * @param barSpace   the space between individual bars in values (not pixels) e.g. 0.1f for bar width 1f
     */
    public void groupBars(float fromX, float groupSpace, float barSpace) {

        if (getBarData() == null) {
            throw new RuntimeException("You need to set data for the chart before grouping bars.");
        } else {
            getBarData().groupBars(fromX, groupSpace, barSpace);
            notifyDataSetChanged();
        }
    }
}

View on GitHub (pinned to 9c7275a059)

Solutions

  1. Call chart.setData(barData) with a non-null BarData before invoking chart.groupBars(...).
  2. Guard the call: if (chart.getBarData() != null && barData.getDataSetCount() >= 2) { chart.groupBars(...); }
  3. Move groupBars() inside the data-loading callback so it runs only after data is assigned.
  4. Verify in a debugger/log that getBarData() is non-null immediately before the groupBars() call.

Example fix

// before
BarChart chart = findViewById(R.id.chart);
chart.groupBars(0f, 0.8f, 0.1f); // crashes: no data

// after
BarData data = new BarData(set1, set2);
data.setBarWidth(0.3f);
chart.setData(data);
chart.groupBars(0f, 0.8f, 0.1f);
Defensive patterns

Strategy: validation

Validate before calling

if (chart.getBarData() != null && chart.getBarData().getDataSetCount() >= 2) {
    chart.groupBars(fromX, groupSpace, barSpace);
} else {
    Log.w(TAG, "Cannot group bars: no/insufficient BarData set on chart");
}

Type guard

boolean canGroupBars(BarChart chart) {
    BarData d = chart.getBarData();
    return d != null && d.getDataSetCount() >= 2;
}

Prevention

When it happens

Trigger: Calling chart.groupBars(fromX, groupSpace, barSpace) on a BarChart before setData(new BarData(...)). Reusing a chart instance whose data was cleared. Calling groupBars() in onCreate before asynchronously loaded data is assigned.

Common situations: Following a tutorial that calls groupBars() but skipping/omitting the setData() step; loading chart data from a network/db callback and calling groupBars() before it returns; resetting the chart with setData(null) then forgetting to re-set data.

Related errors


AI-assisted analysis of PhilJay/MPAndroidChart@9c7275a059 (2026-08-14). Data as JSON: /api/errors/54ef310d27072386. Report an issue: GitHub.