Frage

Nehmen Sie diese Basisklasse:

public abstract class XMPPSubservice
{

    protected XMPPService mTheService;


    protected XMPPSubservice(Context context) 
    {
        Intent intent = new Intent(context, XMPPService.class);
        context.startService(intent);
    }


    public void onServiceInstance(XMPPService service) {
        // TODO Auto-generated method stub
        mTheService = service;
    }

}

Und diese abgeleitete Klasse:

public class PublicDataSubservice extends XMPPSubservice 
{

    private final SomeObject mObj = new SomeObject();

    public PublicDataSubservice(Context context) {
        super(context);
    }

    @Override
    public void onServiceInstance(XMPPService service) 
    {
        super.onServiceInstance(service);
            mObj.doSomethingWith(mTheService);
    }

}

Das Ziel war es, nur Mobj.dosomething mit (mtheservice) zu nennen; Nachdem der Mtheservice gültig wurde (was in der Basisklasse geschah). Die Sache war immer NPE in der Mobj -Linie. Ich kann verstehen, warum das passiert ist, aber es sieht für mich wackelig aus. Ist das also ein Fehler oder eine Funktion von DVM? Wie wäre es mit JVM?

War es hilfreich?

Lösung

Das ist völlig richtig und würde auch in "Vanilla" Java auftreten.

Instanzvariable -Initialisierer werden nur zu Beginn des Konstruktors ausgesetzt nach Der Superclass -Konstruktor hat die Ausführung abgeschlossen. Also während der XMPPSubservice Der Konstruktor wird ausführt, mObj IS NULL - Sie rufen dann eine virtuelle Methode vom Konstruktor auf und die Überschreibung in PublicDataService ausgeführt.

Moral: Rufen Sie keine virtuellen Methoden von Konstruktoren an, es sei denn Sie Ja wirklich In diesem Fall sollten Sie sie wirklich sorgfältig dokumentieren. (Sehr gelegentlich ist es nützlich, aber Sie sollten sich bemühen, es zu vermeiden.) Grundsätzlich bedeutet dies, dass Sie ein potenziell partisch initialisiertes Objekt aufrufen, was hier passiert.

Andere Tipps

Ich habe die folgende Verwendung von Stub -Implementierungen Ihrer Objekte in einem Java -VM ausprobiert.

public static void main(String[] args) {
    Context context = new Context();
    PublicDataSubservice pds = new PublicDataSubservice(context);
    XMPPService service = new XMPPService();
    pds.onServiceInstance(service);
}

Nein NullPointerException.

Vermisse ich etwas? Ich vermute, dass onServiceInstance muss tatsächlich als Ergebnis von aufgerufen werden context.getService(intent)?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top