我正在尝试获取用户的位置,这似乎给我带来了麻烦。
当我调用 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 ,然后才能获得上下文。 Service
和 BroadcastReceiver
类也是如此。
这里有四种获取Context
的解决方案 -
- 将其传递到方法调用中,如下所示:
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/