我正如下面的例外

时间:2011-03-18 11:03:14

标签: android

LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
                    Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                     double longitude = location.getLongitude();
                     double latitude = location.getLatitude();


                if(location == null){
                   longitude = 0.0;
                   latitude = 0.0;
                   Log.i("CURRENT LONGITUDE", ""+longitude);
                   Log.i("CURRENT LATITUDE", ""+latitude);
                }

                Log.i("CURRENT LONGITUDE", ""+longitude);
                Log.i("CURRENT LATITUDE", ""+latitude); 

我遇到问题“double longitude = location.getLongitude();”这是MainActivity中的第93行;

03-18 16:52:26.928: ERROR/AndroidRuntime(9598): java.lang.NullPointerException
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.demo.parsing.MainActivity$1.onClick(MainActivity.java:93)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.View.performClick(View.java:2364)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.View.onTouchEvent(View.java:4179)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.widget.TextView.onTouchEvent(TextView.java:6540)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.View.dispatchTouchEvent(View.java:3709)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.os.Looper.loop(Looper.java:123)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at android.app.ActivityThread.main(ActivityThread.java:4363)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at java.lang.reflect.Method.invokeNative(Native Method)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at java.lang.reflect.Method.invoke(Method.java:521)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
03-18 16:52:26.928: ERROR/AndroidRuntime(9598):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:3)

这很奇怪:

  double longitude = location.getLongitude();
  double latitude = location.getLatitude();
  if(location == null){

您似乎期望该位置可以为NULL。但是上面的两行使用location来调用成员函数。如果它为NULL,那么你将得到一个nullpointerexception。

回复你的评论:你可以通过改变事物的顺序轻松修复它:

Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER)
double latitude;
double longitude;
if(location == null){
    longitude = 0.0;
    latitude = 0.0;
    Log.i("CURRENT LONGITUDE", ""+longitude);
    Log.i("CURRENT LATITUDE", ""+latitude);
}else{
    longitude = location.getLongitude();
    latitude = location.getLatitude();
}

编辑2 如果您只是快速查看手册: http://developer.android.com/reference/android/location/LocationManager.html

你会读到这个:( emph mine)

  

返回指示数据的位置   从上次已知的位置修复   从给定的提供者处获得。这个   可以在没有开始的情况下完成   供应商。注意这个位置   可能是过时的,例如,如果   设备已关闭并移至   另一个位置。 如果提供者是   当前已禁用,返回null。

答案 1 :(得分:1)

只有在使用后才能检查位置是否为空。在分配给经度/纬度时,它可能为空。