2014-07-06 37 views
0

當我試圖從我的GPSTracker類中獲取緯度和經度時,出現空指針異常。我試圖獲得經緯度,並將它們添加到我的網址的末尾。誰能幫我嗎?緯度/長度爲NullPointer異常

這是我的錯誤。

07-06 13:31:40.451: W/System.err(25222): java.net.MalformedURLException 
07-06 13:31:40.451: W/System.err(25222): at java.net.URL.<init>(URL.java:152) 
07-06 13:31:40.451: W/System.err(25222): at java.net.URL.<init>(URL.java:125) 
07-06 13:31:40.451: W/System.err(25222): at rafa.weatherapp.JSONParser.getJSONFromUrl(JSONParser.java:28) 
07-06 13:31:40.451: W/System.err(25222): at rafa.weatherapp.MainActivity$AsyncTaskParseJson.doInBackground(MainActivity.java:70) 
07-06 13:31:40.451: W/System.err(25222): at rafa.weatherapp.MainActivity$AsyncTaskParseJson.doInBackground(MainActivity.java:1) 
07-06 13:31:40.451: W/System.err(25222): at android.os.AsyncTask$2.call(AsyncTask.java:288) 
07-06 13:31:40.451: W/System.err(25222): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
07-06 13:31:40.451: W/System.err(25222): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
07-06 13:31:40.456: D/GPS Enabled(25222): GPS Enabled 
07-06 13:31:40.456: W/System.err(25222): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
07-06 13:31:40.456: W/System.err(25222): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
07-06 13:31:40.461: W/System.err(25222): at java.lang.Thread.run(Thread.java:841) 
07-06 13:31:40.461: D/AndroidRuntime(25222): Shutting down VM 
07-06 13:31:40.461: E/Buffer Error(25222): Error converting result java.lang.NullPointerException: lock == null 
07-06 13:31:40.461: W/dalvikvm(25222): threadid=1: thread exiting with uncaught exception (group=0x41749c08) 
07-06 13:31:40.461: E/JSON Parser(25222): Error parsing data org.json.JSONException: End of input at character 0 of 
07-06 13:31:40.461: E/AndroidRuntime(25222): FATAL EXCEPTION: main 
07-06 13:31:40.461: E/AndroidRuntime(25222): Process: rafa.weatherapp, PID: 25222 
07-06 13:31:40.461: E/AndroidRuntime(25222): java.lang.RuntimeException: Unable to start activity ComponentInfo{rafa.weatherapp/rafa.weatherapp.MainActivity}: java.lang.NullPointerException 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2471) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread.access$900(ActivityThread.java:175) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.os.Handler.dispatchMessage(Handler.java:102) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.os.Looper.loop(Looper.java:146) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread.main(ActivityThread.java:5602) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at java.lang.reflect.Method.invokeNative(Native Method) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at java.lang.reflect.Method.invoke(Method.java:515) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at dalvik.system.NativeStart.main(Native Method) 
07-06 13:31:40.461: E/AndroidRuntime(25222): Caused by: java.lang.NullPointerException 
07-06 13:31:40.461: E/AndroidRuntime(25222): at rafa.weatherapp.GPSTracker.getLatitude(GPSTracker.java:91) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at rafa.weatherapp.MainActivity.onCreate(MainActivity.java:40) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.Activity.performCreate(Activity.java:5451) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
07-06 13:31:40.461: E/AndroidRuntime(25222): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377) 
07-06 13:31:40.461: E/AndroidRuntime(25222): ... 11 more 

這裏是我GPSTracker類

public class GPSTracker extends Service implements LocationListener{ 

private final Context mContext; 
boolean isGPSEnabled = false; 
boolean isNetworkEnabled = false; 
boolean canGetLocation = false; 

Location location; 
Double latitude; 
Double longitude; 

private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; //10 meters 
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; //1 minute 
protected LocationManager locationManager; 

public GPSTracker (Context context){ 
    this.mContext = context; 
    getLocation(); 
} 

public Location getLocation() { 
    try { 
     locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

     //getting GPS status 
     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if(!isGPSEnabled && !isNetworkEnabled){ 
      //no network provider is enabled 
     } else{ 
      this.canGetLocation = true; 
      // First get location from Network provider 
      if (isNetworkEnabled){ 
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       Log.d("Network", "Network"); 
       if(locationManager != null){ 
        location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if(location != null){ 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
      if (isGPSEnabled){ 
       if(location == null){ 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("GPS Enabled", "GPS Enabled"); 
        if(locationManager != null){ 
         location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if(location != null){ 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
      } 
     } 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
    return location; 
} 
/** 
* Function to get latitude 
* */ 
public double getLatitude(){ 
    if(location != null){ 
     latitude = location.getLatitude(); 

     System.out.print(latitude); 
    } 

    return latitude; 
} 
public double getLongitude(){ 
    if(location != null){ 
     longitude = location.getLongitude(); 
    } 
    return longitude; 
} 

/** 
* Function to show setting alert dialog 
*/ 
public void showSettingsAlert(){ 
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

    //Setting Dialog Title 
    alertDialog.setTitle("GPS is settings"); 
    //Setting Dialog Message 
    alertDialog.setMessage("GPS is not enabled. Do you want to go to settings and enable GPS?"); 
    //Setting Icon to Dialog 
    //alertDialog.setIcon(R.drawable.delete); 
    //On Pressing Settings button 
    alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
        mContext.startActivity(intent); 

     } 
    }); 
    //on pressing cancel button 
    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ 
     public void onClick(DialogInterface dialog, int which){ 
      dialog.cancel(); 
     } 
    }); 
    //Showing alert message 
    alertDialog.show(); 
} 

public void stopUsingGPS(){ 
    if(locationManager != null){ 
     locationManager.removeUpdates(GPSTracker.this); 
    } 
} 
@Override 
public void onLocationChanged(Location location){  
} 
@Override 
public void onProviderDisabled(String provider){   
} 
@Override 
public void onProviderEnabled(String provider){  
} 
@Override 
public void onStatusChanged(String provider, int status, Bundle extras){   
} 
@Override 
public IBinder onBind(Intent arg0){ 
    return null; 
} 
} 

這裏是我的MainActivity

public class MainActivity extends Activity { 

    TextView weather = null; 
    TextView summary = null; 
    TextView icon = null; 
    JSONObject currentTemperature = null; 
    String temperature = ""; 
    String weatherSummary = ""; 
    String weatherIcon = ""; 
    GPSTracker gps; 
    double latitude = 0; 
    double longitude = 0; 
    String myUrl; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     weather = (TextView) findViewById(R.id.weather); 
     summary = (TextView) findViewById(R.id.weather_summary); 
     icon = (TextView) findViewById(R.id.string_icon);   
     // we will using AsyncTask during parsing 
     new AsyncTaskParseJson().execute(); 

     gps = new GPSTracker(MainActivity.this); 
     myUrl = "https://api.forecast.io/forecast/5530508d3568e57848d53bf10cfade1f/" + 
       gps.getLatitude() + "," + gps.getLongitude(); 
    } 

    /* public String convertLatitude(){ 
     latitude = gps.getLatitude(); 
     String latitude2 = Double.toString(latitude); 

     return latitude2; 
    }*/ 

    /* public String convertLongitude(){ 
     longitude = gps.getLongitude(); 
     String longitude2 = Double.toString(longitude); 

     return longitude2; 
    }*/ 

    //do in background method to call JSON Parser 
    public class AsyncTaskParseJson extends AsyncTask<String, String, String> { 
     final String TAG = "AsyncTaskParseJson.java";  

     @Override 
     protected String doInBackground(String... arg0){ 

      try { 


       // instantiate our json parser 
       JSONParser jParser = new JSONParser(); 
       // get json string from url 
       JSONObject json = jParser.getJSONFromUrl(myUrl); 


       JSONObject current = json.getJSONObject("currently"); 
       temperature = current.getString("temperature"); 

       weatherSummary = current.getString("summary"); 
       weatherIcon = current.getString("icon"); 





      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     return myUrl; 


     } 

     @Override 
     protected void onPostExecute(String strFromDoInBg) { 

      weather.setText(temperature); 
      summary.setText(weatherSummary); 
      icon.setText(weatherIcon); 

     } 
    } 
} 

回答

1

您的AsyncTask的執行後置myUrl。這可能是空的,這就是爲什麼你在logcat中得到NullPointerException異常:

JSONObject json = jParser.getJSONFromUrl(myUrl); 

at rafa.weatherapp.MainActivity$AsyncTaskParseJson.doInBackground(MainActivity.java:1) 
E/Buffer Error(25222): Error converting result java.lang.NullPointerException: lock == null 
1
Caused by: java.lang.NullPointerException 
    at rafa.weatherapp.GPSTracker.getLatitude(GPSTracker.java:91) 

對於這個NPE在getLatitude():你拆箱一個nullDouble爲原始double。從if (location != null)分支返回一個值,例如

​​
+0

啊。這並沒有解決它 – Rafa