NullPointerException bei AndEngine

Die mobile Denkfabrik  –  0 Kommentare

AndEngine ist ein leistungsfähiges Framework für 2D-Spiele – diverse Hits (z. B. Flappy Bird) entstanden unter Zuhilfenahme dieser quelloffenene Spiel-Engine. Leider hat sie die Eigenschaft, mitunter beim Start mit einer kryptischen Fehlermeldung abzustürzen.

Die Quelle des Fehlers liegt normalerweise in der onCreate-Methode, die bedenkenlos aus dem vorgegebenen Projektskelett übernommen wird:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

Die korrekt funktionierende Variante des Codes sieht so aus:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
}

Dazu noch ein wenig Hintergrundinformationen: Der Aufruf von setContentView findet sich in super.onCreate(). Wenn man die Methode zweimal in Folge aufruft, entsteht eine Gruppe von RenderSurfaceViews. Einige davon bleiben uninitialisiert.

Frei nach Murphys Gesetz ruft AndEngine meist diese Instanzen auf. Die Übeltäter-Routine sieht dann so aus:

@Override
protected void onMeasure(final int pWidthMeasureSpec,
final int pHeightMeasureSpec) {
if(this.isInEditMode()) {
super.onMeasure(pWidthMeasureSpec, pHeightMeasureSpec);
return;
}
    //CRASH hier
this.mEngineRenderer.mEngine.getEngineOptions().getResolutionPolicy().
onMeasure(this, pWidthMeasureSpec, pHeightMeasureSpec);
}

PS: Es hilft nicht, gegen mEngineRenderer==null zu prüfen. Das Nichtaufrufen der onMeasure-Funktion hinterlässt das Gesamtframework in einem ungültigen Zustand.