Java 关闭应用程序后获取NullPointerException-android

Java 关闭应用程序后获取NullPointerException-android,java,android,service,nullpointerexception,Java,Android,Service,Nullpointerexception,我在关闭(以及从我设备上最近的应用程序中删除)我的应用程序后出现此错误,每次都会发生 09-22 23:44:28.503 4021-4021/? I/art﹕ Late-enabling -Xcheck:jni 09-22 23:44:28.584 4021-4021/cz.united121.android.revizori D/cz.united121.android.revizori.App﹕ onCreate 09-22 23:44:28.642 4021-4021/

我在关闭(以及从我设备上最近的应用程序中删除)我的应用程序后出现此错误,每次都会发生

09-22 23:44:28.503    4021-4021/? I/art﹕ Late-enabling -Xcheck:jni
09-22 23:44:28.584    4021-4021/cz.united121.android.revizori D/cz.united121.android.revizori.App﹕ onCreate
09-22 23:44:28.642    4021-4021/cz.united121.android.revizori D/cz.united121.android.revizori.service.MyUpdatingService﹕ onCreate
09-22 23:44:28.677    4021-4021/cz.united121.android.revizori D/AndroidRuntime﹕ Shutting down VM
09-22 23:44:28.679    4021-4021/cz.united121.android.revizori E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: cz.united121.android.revizori, PID: 4021
    java.lang.RuntimeException: Unable to start service cz.united121.android.revizori.service.MyUpdatingService@3a7bf84e with null: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getAction()' on a null object reference
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2913)
            at android.app.ActivityThread.access$2100(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            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 invoke virtual method 'java.lang.String android.content.Intent.getAction()' on a null object reference
            at cz.united121.android.revizori.service.MyUpdatingService.onStartCommand(MyUpdatingService.java:94)
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2896)
            at android.app.ActivityThread.access$2100(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1390)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            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)
异常引用的行(Log.d(标记“onStartCommand”+intent.getAction());)在onStartCommand中使用:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        Log.d(TAG, "onStartCommand" + intent.getAction());
        if (intent.getAction().equals(SERVICE_FORCE)) {
            LOCATION_APROVAL = true;
            if (mLastKnownPosition != null) {
                mTimeAproving.run();
            }
        } else if (intent.getAction().equals(SERVICE_START)) {
            mUpdatingTimer.scheduleAtFixedRate(mTimeAproving, 0, PERIOD_BETWEEN_UPDATING);
        } else if (intent.getAction().equals(SERVICE_STOP)) {
            LOCATION_APROVAL = false;
            mLastKnownPosition = null;
            mUpdatingTimer.cancel();
            mUpdatingTimer.purge();
        }
        return START_STICKY;
    }

提前感谢。

您的应用程序和服务被终止,然后在您使用START\u STICKY标志时,服务被重新启动。在这种情况下,传递给
onStartCommand()
intent
将为空。看


根据您的逻辑,您可以考虑返回<代码> StaskRePurvivItActudio。

< P> >在<强> >(意愿.GATActhOn()(Service EXSTOP))<强/>外壳> < /P> < P>,如果有人使用Surviv.Exchange(0),我就解决了我的问题。在Backpressed上使用Overwriden方法关闭应用程序时出错,只需将其删除并使用finish()。如果使用System.exit(0),它将终止前台服务。

在从intent获取任何操作之前,请检查intent是否为null,如果不为null,则检查getAction()值,否则不为空。@Ajit我试图这样做,但它并没有解决问题,只涉及它:我确实需要研究服务标志以了解发生了什么。错误在别处,但感谢您的链接。我会仔细阅读。这解决了问题,因为退出应用程序后服务不会重新启动(在应用程序发送
service\u STOP
后,这似乎不是你的意图)。@headuck所以我可以解决这个问题,即使使用START\u not\u STICKY,这意味着在终止服务后,它不会再次启动。我是对的吗?是的,但是你应该考虑你的服务在结束后被打断后的行为。如果您使用
START\u NOT\u STICKY
,服务将不会重新启动,但请记住,当用户未积极使用应用程序时,您的应用程序和服务可能随时被系统终止。如果您希望您的服务能够重新启动并恢复其工作,那么您可能需要
START\u STICKY
并在收到空意图时实现恢复逻辑。如果可以从头开始,那么您可以使用
start\u REDELIVER\u INTENT
。我不明白这是如何回答这个问题的。这个问题已经有两年多的历史了,并且有一个公认的答案。您的答案增加了什么?只需将System.exit(0)放在onBackpressed方法上,就会得到您的答案。如果将System.exit而不是finish()放入,则所有解决方案均无效。服务可能因多种原因而终止,其中一个原因是System.exit(0)。