NullPointer no método onCreate de um Service

33 views
Skip to first unread message

Bruno Vercelino da Hora

unread,
Jan 29, 2015, 9:20:34 AM1/29/15
to androidb...@googlegroups.com
Galera,

Preciso de uma ajuda urgente.

Nossa aplicação está dando NullPointer no método onCreate de um Service nosso.
No método onCreate eu instancio vários campos do Service, e é nessas atribuições que estou recebendo NullPointer.

O mais bizarro é que isso só acontece no Lollipop e quando eu rodo o Debbuger os objetos estão lá e não dá erro na aplicação.

Alguém consegue pensar em algum motivo para isso estar acontecendo?

Se precisarem de mais informações eu passo.

[]s

Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

Geovani **Leia a documentação oficial** de Souza

unread,
Jan 30, 2015, 9:25:00 AM1/30/15
to androidb...@googlegroups.com
Vc chamou "super.onCreate();"? Fora isso, ajudaria se vc postasse o trecho de código problemático...

Bruno Vercelino da Hora

unread,
Feb 2, 2015, 7:32:22 AM2/2/15
to androidb...@googlegroups.com
Obrigado pela atenção.

Sim eu chamei o super.onCreate().
Estou mandando o método onCreate, não vou mandar tudo pq é muita coisa.
Mas o trecho é basicamente inicializações de campos.

O erro ocorre no:
 batteryHelper = BatteryHelper.getInstance(getBaseContext());

E quando eu rodo o Debug, a variável é instanciada corretamente.

[]s 

 @Override
    public void onCreate() {
        super.onCreate();
        
        // initiate network helper
        if (networkHelper == null)
            networkHelper = new NetworkHelper(getBaseContext(), this);
        // initiate database helper
        if (dbHelper == null)
            dbHelper = new OSDatabaseHelper(getBaseContext());
        // initiate configuration helper
        if (configHelper == null)
            configHelper = new ConfigHelper(dbHelper);
        // initiate photo manager
        if (photoManager == null)
            photoManager = new PhotoManager(getBaseContext(), dbHelper);
        // initiate battery helper
        if (batteryHelper == null)
            batteryHelper = BatteryHelper.getInstance(getBaseContext());
        // find device owner
        deviceOwner = findDeviceOwner();
        // find active workday
        activeWorkday = findActiveWorkday();
        // find active check in
        activeCheckIn = findActiveCheckIn();
        boolean isFirstLocation = activeWorkday == null || activeWorkday.geocoord == null;
        // initiate geolocation helper
        if (geoHelper == null)
            geoHelper = new GeoHelper(getBaseContext(), dbHelper, this, isFirstLocation);
        // initiate vibrator
        if (vibrator == null)
            vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        // check if application is already authenticated
        authenticated = configHelper.checkIfExists(Configs.AUTHENTICATED);
        // start to watch SMSs trying to find a sms to authenticated
        if (!authenticated && smsHelper == null) {
            // TWW: 27800
            List<String> numbersToWatches = Arrays.asList("27800");
            smsHelper = new SmsHelper(getBaseContext(), this, numbersToWatches);
        } else if (authenticated) {
            setGlobalDeviceHash();
            // start timer to check if is between 8am and 6pm
            setWorkdayAlarms();
            // Try to sync anything pendent
            dbHelper.syncAll();
        }
        // if workday is initiated start to track device
        if (activeWorkday.isInitiated())
            this.start();
        apiClient = ApiClient.getInstance(getBaseContext());
    }

Geovani **Leia a documentação oficial** de Souza

unread,
Feb 2, 2015, 7:52:50 AM2/2/15
to androidb...@googlegroups.com
Bom Bruno, é muita coisa que ainda não diz muita coisa, já que seu onCreate chama diversos outros métodos que não estão listado aí.

De qualquer forma, vc já tentou colocar um breakpoint na dita linha e ir executando passo-a-passo com o debuger (inclusive entrando nos métodos) e visualizando os valores de cada variável no painel Variables? (estou supondo que vc usa Android Studio)

Bruno Vercelino da Hora

unread,
Feb 2, 2015, 8:01:32 AM2/2/15
to androidb...@googlegroups.com
Oi Geovani, posso colocar a classe inteira, mas ela é gigantesca (muito mal feita, diga-se de passagem).

Mas como disse, quando executo com o debugger linha a linha o NullPointer não ocorre.
É isso que me deixa mais confuso nesse problema.


Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

Em 2 de fevereiro de 2015 10:52, Geovani **Leia a documentação oficial** de Souza <geovani...@gmail.com> escreveu:
Bom Bruno, é muita coisa que ainda não diz muita coisa, já que seu onCreate chama diversos outros métodos que não estão listado aí.

De qualquer forma, vc já tentou colocar um breakpoint na dita linha e ir executando passo-a-passo com o debuger (inclusive entrando nos métodos) e visualizando os valores de cada variável no painel Variables? (estou supondo que vc usa Android Studio)

--
You received this message because you are subscribed to a topic in the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/androidbrasil-dev/jOq2c3-Cb3M/unsubscribe.
To unsubscribe from this group and all its topics, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Geovani **Leia a documentação oficial** de Souza

unread,
Feb 2, 2015, 8:08:50 AM2/2/15
to androidb...@googlegroups.com
Adoro Android e essas bruxarias! kkkk

Se quiser postar, recomendo postar no Gist e deixar o link aqui.

Sobre o problema, vc tem certeza que todos os seus "helpers" e esse método "getBaseContext()" são safe? Em nenhum momento eles deixam de ser static ou são sobrescritos?

Já passei por um caso maluco desses algumas vezes e em geral, o erro surge de outro lugar que não tem nada a ver com a sequência do código...

Geovani **Leia a documentação oficial** de Souza

unread,
Feb 2, 2015, 8:09:42 AM2/2/15
to androidb...@googlegroups.com
Fora isso, usar alternativas como Dagger ajuda a estirpar parte da complexidade com injeção de dependências.

luciofm

unread,
Feb 2, 2015, 8:28:19 AM2/2/15
to androidb...@googlegroups.com
Sempre que for pedir ajuda com um NullPointerException, ou com qualquer outra exception, poste o stacktrace...

On Mon Feb 02 2015 at 11:09:43 AM Geovani **Leia a documentação oficial** de Souza <geovani...@gmail.com> wrote:
Fora isso, usar alternativas como Dagger ajuda a estirpar parte da complexidade com injeção de dependências.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.

Bruno Vercelino da Hora

unread,
Feb 2, 2015, 8:31:14 AM2/2/15
to androidb...@googlegroups.com
Segue o stacktrace:

02-02 11:04:20.347    7485-7485/br.com.trackmob.electrolux E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: br.com.trackmob.electrolux, PID: 7485
    java.lang.RuntimeException: Unable to create service br.com.trackmob.electrolux.helpers.core.CoreService: java.lang.NullPointerException: Attempt to write to field 'br.com.trackmob.electrolux.helpers.battery.BatteryHelper br.com.trackmob.electrolux.helpers.core.CoreService.batteryHelper' on a null object reference
            at android.app.ActivityThread.handleCreateService(ActivityThread.java:2773)
            at android.app.ActivityThread.access$1800(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5314)
            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:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.NullPointerException: Attempt to write to field 'br.com.trackmob.electrolux.helpers.battery.BatteryHelper br.com.trackmob.electrolux.helpers.core.CoreService.batteryHelper' on a null object reference
            at br.com.trackmob.electrolux.helpers.core.CoreService.initializeService(CoreService.java:155)
            at br.com.trackmob.electrolux.helpers.core.CoreService.onCreate(CoreService.java:136)
            at android.app.ActivityThread.handleCreateService(ActivityThread.java:2764)
            at android.app.ActivityThread.access$1800(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1376)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5314)
            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:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)

Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

--
You received this message because you are subscribed to a topic in the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/androidbrasil-dev/jOq2c3-Cb3M/unsubscribe.
To unsubscribe from this group and all its topics, send an email to androidbrasil-...@googlegroups.com.

Geovani **Leia a documentação oficial** de Souza

unread,
Feb 2, 2015, 8:51:23 AM2/2/15
to androidb...@googlegroups.com
Bruno, o erro não ocorre no onCreate, mas no CoreService.initializeService, linha 155. O que há nessa linha?

Bruno Vercelino da Hora

unread,
Feb 2, 2015, 9:02:15 AM2/2/15
to androidb...@googlegroups.com
Ah eu simplifiquei o código para enviar para vocês, o initializeService é o trecho de código das inicializações após o onCreate().
Segue o código em anexo.

Pra mim simplesmente não tem explicação, pq ele funciona ok com o debugger, e quando vou colocando prints para ver se dá algum nullpointer, ele funciona normal.
Simplesmente sem sentido...

P.S.: O código não é meu, só estou dando manutenção...

private void initializeService() {
        TMLog.i(this, "Initializing service.");

        // initiate network helper
        if (networkHelper == null)
            networkHelper = new NetworkHelper(this, this);
        // initiate database helper
        if (dbHelper == null)
            dbHelper = new OSDatabaseHelper(this);
        // initiate configuration helper
        if (configHelper == null)
            configHelper = new ConfigHelper(dbHelper);
        // initiate photo manager
        if (photoManager == null)
            photoManager = new PhotoManager(this, dbHelper);
        // initiate battery helper
        if (batteryHelper == null)
            batteryHelper = BatteryHelper.getInstance(this);

        // find device owner
        deviceOwner = findDeviceOwner();
        // find active workday
        activeWorkday = findActiveWorkday();
        // find active check in
        activeCheckIn = findActiveCheckIn();

        boolean isFirstLocation = activeWorkday == null || activeWorkday.geocoord == null;

        // initiate geolocation helper
        if (geoHelper == null)
            geoHelper = new GeoHelper(this, dbHelper, this, isFirstLocation);
        // initiate vibrator
        if (vibrator == null)
            vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

        // check if application is already authenticated
        authenticated = configHelper.checkIfExists(Configs.AUTHENTICATED);
        // start to watch SMSs trying to find a sms to authenticated
        if (!authenticated && smsHelper == null) {
            // TWW: 27800
            List<String> numbersToWatches = Arrays.asList("27800");
            smsHelper = new SmsHelper(this, this, numbersToWatches);
        } else if (authenticated) {
            setGlobalDeviceHash();

            // start timer to check if is between 8am and 6pm
            setWorkdayAlarms();

            // Try to sync anything pendent
            dbHelper.syncAll();
        }

        // if workday is initiated start to track device
        if (activeWorkday.isInitiated())
            this.start();

        apiClient = ApiClient.getInstance(this);

        initialized = true;

        TMLog.i(this, "Service initializes.");
    }


Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

2015-02-02 11:51 GMT-02:00 Geovani **Leia a documentação oficial** de Souza <geovani...@gmail.com>:
Bruno, o erro não ocorre no onCreate, mas no CoreService.initializeService, linha 155. O que há nessa linha?

--
CoreService.java

Geovani **Leia a documentação oficial** de Souza

unread,
Feb 2, 2015, 10:27:31 AM2/2/15
to androidb...@googlegroups.com
Bruno, realmente é um código extenso e poderia ter aplicado melhores práticas...

Aparentemente, batteryHelper não é utilizado no CoreService (o que já não faz sentido), mas imagino que alguma exceção esteja escapando sem declaração/tratamento de BatteryHelper.getInstance().

Bruno Vercelino da Hora

unread,
Feb 2, 2015, 11:21:16 AM2/2/15
to androidb...@googlegroups.com
Como disse, não fui eu quem fiz o código, só estou dando manutenção.

E não é um problema no getInstance, pq coloquei uns Logs e ele gera a instância corretamente.
O problema é quando eu vou escrever no campo batteryHelper.

O problema só acontece na versão 5.0+, será que os campos de um Service estão sendo criados de alguma forma diferente?

[]s

Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

Em 2 de fevereiro de 2015 13:27, Geovani **Leia a documentação oficial** de Souza <geovani...@gmail.com> escreveu:
Bruno, realmente é um código extenso e poderia ter aplicado melhores práticas...

Aparentemente, batteryHelper não é utilizado no CoreService (o que já não faz sentido), mas imagino que alguma exceção esteja escapando sem declaração/tratamento de BatteryHelper.getInstance().

--

geovani...@gmail.com

unread,
Feb 2, 2015, 11:36:32 AM2/2/15
to androidb...@googlegroups.com
Bruno, considerando que a partir da 5.0 a máquina virtual é a ART, e a mensagem sugere que vc está "escrevendo num campo null", eu diria pra vc remover o "= null" do campo e testar. Isso é só um chute, mas vai saber...

Bruno Vercelino da Hora

unread,
Feb 3, 2015, 6:56:26 AM2/3/15
to androidb...@googlegroups.com
Eu tentei isso e não rolou.

Na verdade eu tentei mais um monte de coisa, nenhuma lógica ou significativa, mas o erro parou de acontecer.
Não faço a menor ideia do que eu fiz! Coisas místicas da programação!

Mas como vamos abandonar esse código, não fiz muito esforço de entender!

Obrigado pela ajuda pessoal!

Bruno Vercelino da Hora
--
"Mas Deus prova o seu próprio amor para conosco pelo fato de ter Cristo morrido por nós, sendo nós ainda pecadores." - Romanos 5:8
"Mas em nada tenho a minha vida como preciosa para mim, contando que complete a minha carreira e o ministério que recebi do Senhor Jesus, para dar testemunho do evangelho da graça de Deus." - Atos 20:24

2015-02-02 14:35 GMT-02:00 geovani...@gmail.com <geovani...@gmail.com>:
Bruno, considerando que a partir da 5.0 a máquina virtual é a ART, e a mensagem sugere que vc está "escrevendo num campo null", eu diria pra vc remover o "= null" do campo e testar. Isso é só um chute, mas vai saber...

Reply all
Reply to author
Forward
0 new messages