调用虚拟方法 null context.getSystemService

invoke virtual method null context.getSystemService

我的 logcat 中出现此错误,没有其他信息。

Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference

在调试时我发现这部分产生了错误:

PendingIntent reply = intent.getParcelableExtra(PENDING_RESULT_EXTRA);
if (reply != null) {
if (requestType == 1) {
    try {
        if (! googInfo.equals("") || googReach) {
            googReach = true;
        }

        if (! tradInfo.equals("") || tradReach) {
            tradReach = true;
        }

        if (tradReach && googReach) {// && ! tooSlow) {
            reply.send(RESULT_BOTH_AVAILABLE);
        } else if (tradReach) {// && ! tooSlow) {
            reply.send(RESULT_TRAD_AVAILABLE);
        } else if (googReach) {// && ! tooSlow) {
            reply.send(RESULT_GOOG_AVAILABLE);
        } else {
            reply.send(RESULT_UNAVAILABLE);
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
} else {
    try {
        if (! googInfo.equals("") || ! tradInfo.equals("") || googReach || tradReach) {
            reply.send(RESULT_AVAILABLE);
        } else {
            reply.send(RESULT_UNAVAILABLE);
        }
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}
}

更准确地说,我执行以下操作的部分:

reply.send(RESULT_AVAILABLE);

这是一个由 Activity 启动的 IntentService。在调试时,我可以看到回复对象已正确填充,并且 RESULT_AVAILABLE 是一个静态最终整数,它也具有正确的值。

此 IntentService 使用以下代码调用:

PendingIntent pendingResult = createPendingResult(INTERNET_AVAILABILITY_CODE, new Intent(), 0);
Intent intent = new Intent(getApplicationContext(), PingIntentService.class);
intent.putExtra(PingIntentService.PENDING_RESULT_EXTRA, pendingResult);
startService(intent);

奇怪的是,我没有对代码的这些部分进行任何更改,而且它始终可以正常工作。另一件奇怪的事情是我的 try / catch 块没有捕获异常。我在该捕获中放置了断点和更多信息,以便我可以尝试获取有关该错误的更多信息,但该部分未被触发。

我已经用谷歌搜索了这个错误,很多人似乎在其他情况下也有这个问题。我知道我的上下文是空的,但是在调试时我可以看到它不是空的......即使我找到了所有链接/答案我仍然找不到问题的根源。

只是作为一个侧节点。

用这种 condition:

编写代码 null safe
"".equals(tradInfo)

如果 tradInfo 为 null(也许这是一个有效的情况?),tradInfo.equals("") 你将得到一个 NullPointerException。如果您切换它,则不会发生。

在继续寻找解决方案的过程中,感谢 CommonsWare,我偶然发现了答案。错误本身不在这部分:

reply.send(RESULT_AVAILABLE);

我正在搜索为什么我在 Java 堆栈跟踪中没有看到任何内容。我认为错误应该在上面代码中的 try / catch 块中被捕获,但是错误发生在 Activity 从 IntentService 返回结果时。

确实有一段代码我的Context对象还是Null。我将其更改为 getApplicationContext() 并已修复。这个错误以前从未发生过,因为它只发生在应用程序在设备中第一次启动时。它仍然是一开始添加的一段代码,我在其中存储我的应用程序上下文并传递它。第一次启动时,这个对象还没有被填充,就出现了这个错误。