Pregunta

Tome esta clase base:

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;
    }

}

Y esta clase derivada:

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);
    }

}

El objetivo era llamar solo a Mobj.DosiMingthith (MTHESERVICE); después de que el servicio se volvió válido (lo que sucedió en la clase base). La cosa fue siempre escupir NPE en la línea MOBJ. Puedo entender por qué sucedió eso, pero me parece aturdido. Entonces, ¿es este un error o una característica de DVM? ¿Qué tal JVM?

¿Fue útil?

Solución

Eso es completamente correcto y también ocurriría en Java "Vanilla".

Los inicializadores variables de instancia solo se ejecutan al comienzo del cuerpo del constructor después El constructor de superclase ha completado la ejecución. Entonces mientras el XMPPSubservice El constructor está ejecutando, mObj es nulo: luego llama a un método virtual desde el constructor y la anulación en PublicDataService ejecuta.

Moral: no llame a métodos virtuales de constructores, a menos que usted De Verdad Tengo que, en cuyo caso, debe documentarlos realmente cuidadosamente. (Muy ocasionalmente es útil, pero debes esforzarte para evitarlo). Básicamente significa que terminas con una llamada en un objeto potencialmente inicializado, que es lo que está sucediendo aquí.

Otros consejos

Intenté lo siguiente usando implementaciones de Stub de sus objetos en una VM Java.

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

No NullPointerException.

¿Me estoy perdiendo de algo? Supongo onServiceInstance en realidad debe ser llamado como resultado de context.getService(intent)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top