2013-04-30 49 views
1

我從下面這行代碼得到一個空指針異常:NullPointerException異常 - 位置和的LocationManager - 雙

double longitude = location.getLongitude(); 

我有一個問題搞清楚的問題是什麼。

LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, waypointActivity); 

    //LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Location location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
    double longitude = location.getLongitude(); 
    double latitude = location.getLatitude(); 
    String locLat = String.valueOf(latitude)+","+String.valueOf(longitude); 

這裏是logcat的輸出:

04-30 10:20:54.988: E/AndroidRuntime(1827): FATAL EXCEPTION: main 
04-30 10:20:54.988: E/AndroidRuntime(1827): java.lang.RuntimeException: Unable to instantiate application android.app.Application: java.lang.NullPointerException 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.LoadedApk.makeApplication(LoadedApk.java:504) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4364) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.ActivityThread.access$1300(ActivityThread.java:141) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.os.Looper.loop(Looper.java:137) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at dalvik.system.NativeStart.main(Native Method) 
04-30 10:20:54.988: E/AndroidRuntime(1827): Caused by: java.lang.NullPointerException 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.LoadedApk.initializeJavaContextClassLoader(LoadedApk.java:379) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.LoadedApk.getClassLoader(LoadedApk.java:322) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  at android.app.LoadedApk.makeApplication(LoadedApk.java:496) 
04-30 10:20:54.988: E/AndroidRuntime(1827):  ... 11 more 
04-30 10:21:04.048: E/Trace(1863): error opening trace file: No such file or directory (2) 

我不明白爲什麼認爲我的位置變量爲空。任何建議,將不勝感激。

+4

因爲它是空的。 – 2013-04-30 15:30:32

+0

請參閱http://stackoverflow.com/questions/1608632/android-locationmanager-getlastknownlocation-returns-null – Fildor 2013-04-30 15:31:10

+1

沒有人認爲您的位置變量爲空。顯然它有加載你的apk出於某種原因的問題,可能是你的應用程序的名稱?除非你的一些進程處於靜態塊中? – njzk2 2013-04-30 15:31:38

回答

5

documentation狀態:

返回一個位置指示從最後已知位置 數據弄不好從給定的供應商處獲得。

這可以在不啓動提供程序的情況下完成。請注意,此 位置可能已過期,例如,如果該設備已關閉並移動到其他位置,則會關閉該位置 。

如果提供者當前被禁用,則返回null。

由於您的GPS位置爲空,您可能尚未打開GPS或您的手機沒有GPS。

(使用手機的GPS訪問位置),需要一些時間來訪問位置更改您的代碼

Location location = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
if (location!=null){ 
    double longitude = location.getLongitude(); 
    double latitude = location.getLatitude(); 
    String locLat = String.valueOf(latitude)+","+String.valueOf(longitude); 
} 
+0

即使提供者已啓用,它也可以爲空。大多數情況下,如果以前沒有請求位置... – WarrenFaith 2013-04-30 15:39:31

+0

@WarrenFaith我想你是對的,但我只是說明文檔說什麼。你有參考證實這種行爲嗎? – DigCamara 2013-04-30 15:42:49

+0

幾乎每次我開始一個應用程序:)沒有真正的數據,只是我的個人經驗。 – WarrenFaith 2013-04-30 16:00:40

0

LocationManager.GPS_PROVIDER,由於您是從locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)

越來越位置爲空讓你的位置對象全局和你的waypointActivity初始化這個對象在執行onLocationChanged方法LocationListener

這樣的事情: -

@Override 
public void onLocationChanged(Location location) { 
    this.location = location; 
} 

然後檢查位置不使用它作爲前空: -

if (location!=null){ 
     double longitude = location.getLongitude(); 
     double latitude = location.getLatitude(); 
     String locLat = String.valueOf(latitude)+","+String.valueOf(longitude); 
    } 

我會建議你使用LocationManager.NETWORK_PROVIDER insted的,因爲它給出結果比GPS_PROVIDER快得多。