java - getApplicationContext() 处的空指针异常

标签 java android

我正在尝试获取用户的位置,这似乎给我带来了麻烦。 当我调用 distanceBetween() 来查看测试是否正常工作时,我在 getApplicationContext() 处收到 NullPointerException。有什么我没有做的吗?

这是堆栈跟踪:

java.lang.NullPointerException at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) at com.ayy.zz.DistanceFinder.onCreate(DistanceFinder.java:38) at com.ayy.zz.DistanceFinder.distanceBetween(DistanceFinder.java:82) at com.ayy.zz.DistanceFinderTests.testSomething(DistanceFinderTests.java:14) at java.lang.reflect.Method.invokeNative(Native Method) at student.TestCase.runBare(TestCase.java:108) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1701)

TestSomething 只是初始化 DistanceFinder 并调用 distanceBetween 方法:

    public double distanceBetween()
    {
        onCreate();
        return dining1.distanceTo(dining2);
    }

最佳答案

您不能简单地调用 onCreate 来获取上下文。目前尚不清楚您要做什么或何时调用 distanceBetween 但显然是在 Android“创建”Activity 之前的某个时间。 (What is 'Context' on Android?)

此外,您的 mContext 不应该是静态的,尽管这是允许的,但这将使您即使在未创建实例时也可以访问该变量,同时也会给您一个 NPE。

当您访问Context时,您需要确保Android实际上已经为您的对象创建/传递了一个上下文。在这种情况下,必须先“启动” Activity ,然后才能获得上下文。 ServiceBroadcastReceiver 类也是如此。

这里有四种获取Context的解决方案 -

  1. 将其传递到方法调用中,如下所示:
public double distanceBetween(Context mContext)
{
    locationManager = (LocationManager) mContext
        .getSystemService(Context.LOCATION_SERVICE);
    dining1 = new Location("");
    dining1.setLatitude(37.226500);
    dining1.setLongitude(-80.419179);
    dining2 = new Location("");
    dining2.setLatitude(37.229219);
    dining2.setLongitude(-80.418310);
    return dining1.distanceTo(dining2);
}
  • 仅在 Android 创建 Activity 后调用您的方法(而不是通过调用 onCreate()

  • 创建一个服务并将您的请求传递给该服务并使用其上下文

  • http://www.vogella.com/tutorials/AndroidServices/article.html

  • 请谨慎考虑使用 Application 类,该类应在您的应用运行时随时可访问。
  • 关于java - getApplicationContext() 处的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27001919/

    相关文章:

    Android Intent 清除顶部不起作用

    java - Android,Java通过HttpClient-HttpPut

    java - 尝试以简单的方式从 ListView 中的 Url 检索图像

    java - Java 在应用强制转换运算符后是否有可能返回对另一个变量的引用?

    java - 回收者 View 混合了其元素的内容

    java - 使用数组查找最大数字

    java - 通过反射获取子类字段

    android - 在没有 XML 的情况下创建布局

    Android - 顶部透明的选项菜单

    java - Android SHA1 非常慢