getApplicationContext()中的nullpointerexception

时间:2014-11-18 19:01:03

标签: java android

我试图获取用户的位置,这似乎给我带来了麻烦。 当我调用distanceBetween()来查看测试是否有效时,我在getApplicationContext()得到一个NullPointerException。有什么我不做的吗?

这是Stacktrace:

  

java.lang.NullPointerException at   android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109)   在   com.ayy.zz.DistanceFinder.onCreate(DistanceFinder.java:38)   在   com.ayy.zz.DistanceFinder.distanceBetween(DistanceFinder.java:82)   在   com.ayy.zz.DistanceFinderTests.testSomething(DistanceFinderTests.java:14)   在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)   在   android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1701)

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

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

1 个答案:

答案 0 :(得分:2)

您不能简单地调用onCreate来获取上下文。目前还不清楚你要做什么或何时打电话distanceBetween,但显然是在Android"创建"之前。活动。 (What is 'Context' on Android?

此外,您的mContext不应该是静态的,虽然这是允许的,但即使未创建实例,也可以访问变量,同时也为您提供NPE。

当您访问Context时,您需要确保Android实际创建/传递了对象的上下文。在这种情况下,必须启动活动"在它有上下文之前。对于ServiceBroadcastReceiver类也是如此。

以下是获得Context -

的四种解决方案
  1. 将其传递给方法调用,如下所示:
  2. 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);
    }
    
    1. 仅在Android创建活动后调用您的方法(而不是通过调用onCreate()

    2. 进行jsut调用
    3. 创建Service并将您的请求传递给服务并使用其Context

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

      1. 谨慎考虑使用Application类,只要您的应用运行,就可以访问该类。