Почему служба Android аварийно завершает работу с NullPointerException?

Вот код:

public class BillingService extends Service implements ServiceConnection {
...
    @Override
    public void onStart(Intent intent, int startId) {
        handleCommand(intent, startId); // line 361
    }

    /**
     * The {@link BillingReceiver} sends messages to this service using intents.
     * Each intent has an action and some extra arguments specific to that action.
     * @param intent the intent containing one of the supported actions
     * @param startId an identifier for the invocation instance of this service
     */
    public void handleCommand(Intent intent, int startId) {
        String action = intent.getAction();
        if (Debug.Yes) {
            Log.i(TAG, "handleCommand() action: " + action);
        }
        if (Consts.ACTION_CONFIRM_NOTIFICATION.equals(action)) {
            String[] notifyIds = intent.getStringArrayExtra(Consts.NOTIFICATION_ID);
            confirmNotifications(startId, notifyIds);
        } else if (Consts.ACTION_GET_PURCHASE_INFORMATION.equals(action)) {
            String notifyId = intent.getStringExtra(Consts.NOTIFICATION_ID);
            getPurchaseInformation(startId, new String[] { notifyId });
        } else if (Consts.ACTION_PURCHASE_STATE_CHANGED.equals(action)) {
            String signedData = intent.getStringExtra(Consts.INAPP_SIGNED_DATA);
            String signature = intent.getStringExtra(Consts.INAPP_SIGNATURE);
            purchaseStateChanged(startId, signedData, signature);
        } else if (Consts.ACTION_RESPONSE_CODE.equals(action)) {
            long requestId = intent.getLongExtra(Consts.INAPP_REQUEST_ID, -1);
            int responseCodeIndex = intent.getIntExtra(Consts.INAPP_RESPONSE_CODE,
                    ResponseCode.RESULT_ERROR.ordinal());
            ResponseCode responseCode = ResponseCode.valueOf(responseCodeIndex);
            checkResponseCode(requestId, responseCode);
        }
    }

Вот ЛогКэт:

java.lang.RuntimeException: Unable to start service tv.kinobaza.billing.BillingService@45129a30 with null: java.lang.NullPointerException
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
at android.app.ActivityThread.access$3600(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
at tv.kinobaza.billing.BillingService.onStart(BillingService.java:361)
at android.app.Service.onStartCommand(Service.java:420)
at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
... 10 more

person LA_    schedule 02.05.2011    source источник
comment
На какой код указывает строка 361 в вашем BillingService.java?   -  person Hakan Ozbay    schedule 02.05.2011


Ответы (2)


Я считаю, что наиболее вероятной причиной будет то, что intent будет null. Согласно документации для onStartCommand:

intent

Intent передано startService(Intent), как указано. Это может быть null, если служба перезапускается после того, как ее процесс ушел, и ранее она возвращала что-либо, кроме START_STICKY_COMPATIBILITY

person Jean Hominal    schedule 02.05.2011
comment
Что мне делать, чтобы этого избежать? - person LA_; 02.05.2011
comment
@Жан Хоминаль, что мне делать, если intent == null? - person LA_; 02.05.2011
comment
@LA_: Вы проверяли (например, в отладчике), что намерение было нулевым? После этого, если вы обнаружите, что данное намерение является нулевым, то... это ваше приложение. Перечитайте фрагмент документации, который я цитировал, - он объясняет, в каком случае он может быть нулевым. После этого только вы и те, кто разрабатывает ваше приложение, можете решать, что делать. (например, вы можете либо вообще избежать нулевого намерения, либо решить ничего не делать.) - person Jean Hominal; 02.05.2011
comment
@Jean Hominal, я не могу уловить это в отладчике - это происходит через несколько часов (~ 12) после запуска службы. - person LA_; 02.05.2011
comment
@LA_: Похоже, что это соответствует условиям для получения намерения null — ваша служба, вероятно, была остановлена ​​для восстановления системных ресурсов и перезапущена без намерения — это означает, что она была получена без каких-либо действий со стороны пользователя. Я считаю, что вы можете игнорировать его в этом случае. - person Jean Hominal; 03.05.2011
comment
@Jean Hominal, я не могу просто игнорировать это - пользователю отображается сообщение об ошибке. - person LA_; 03.05.2011
comment
@LA_: Под игнорированием я имел в виду, что вы можете поставить null проверку и return;, когда это так (и, возможно, записать, что произошло, если активен режим отладки). - person Jean Hominal; 03.05.2011
comment
У меня такая же ошибка, т.е. нулевой указатель намерения примерно через 12 часов. У меня был return START_STICKY, и я изменил его на return START_STICKY_COMPATIBILITY - person Stephen Hosking; 19.12.2012

person    schedule
comment
Как избежать двойного вызова задачи handleCommand(intent, startId); как будут вызываться onStart() и onStartCommand? это хороший дизайн? @Новобранец - person Sazzad Hissain Khan; 12.11.2013