2013-09-27 22 views
0

嘿大家, 我有一个异步任务,根据用户输入的地址指向地图上的一个点。我在onPostExecute中有一个NullPointerException,我可以找出原因。这里是异步类在我AsyncTask的NullPointerException

 private class GeocoderTask extends AsyncTask<String, Void, List<Address>>{ 

      @Override 
      protected List<Address> doInBackground(String... locationName) { 
       // Creating an instance of Geocoder class 
       Geocoder geocoder = new Geocoder(getBaseContext()); 
       List<Address> addresses = null; 

       try { 
        // Getting only one address that matches the query 
        addresses = geocoder.getFromLocationName(locationName[0], 3); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       }   
       return addresses; 
      } 


      @Override 
      protected void onPostExecute(List<Address> addresses) {   

       if(addresses==null || addresses.size()==0){ 
        Toast.makeText(getBaseContext(), "No Location found.Please check address", Toast.LENGTH_SHORT).show(); 
       } 

       // Clears all the existing markers on the map 
       mMap.clear(); 

       // Adding Markers on Google Map for each matching address 
       for(int i=0;i<addresses.size();i++){// this is line 585 from the logcat    

        Address address = (Address) addresses.get(i); 

        // Creating an instance of GeoPoint, to display in Google Map 
        LatLng latLng_search = new LatLng(address.getLatitude(), address.getLongitude()); 

        String addressText = String.format("%s, %s", 
           address.getMaxAddressLineIndex() > 0 ? address.getAddressLine(0) : "", 
           address.getLocality()); 

         MarkerOptions markerOptions = new MarkerOptions(); 
         markerOptions.position(latLng_search); 
         markerOptions.title(addressText); 

         mMap.addMarker(markerOptions); 


        // Locate the first location 
        if(i==0)       
         mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng_search)); 
       }   
      }    
     } 

这里是logcat的:

09-28 02:51:45.501: E/AndroidRuntime(16587): FATAL EXCEPTION: main 
09-28 02:51:45.501: E/AndroidRuntime(16587): java.lang.NullPointerException 
09-28 02:51:45.501: E/AndroidRuntime(16587): at drkstr.yar.Create_reminder_loc$GeocoderTask.onPostExecute(Create_reminder_loc.java:585) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at drkstr.yar.Create_reminder_loc$GeocoderTask.onPostExecute(Create_reminder_loc.java:1) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.os.AsyncTask.finish(AsyncTask.java:417) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.os.AsyncTask.access$300(AsyncTask.java:127) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.os.Looper.loop(Looper.java:143) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at android.app.ActivityThread.main(ActivityThread.java:4196) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at java.lang.reflect.Method.invokeNative(Native Method) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at java.lang.reflect.Method.invoke(Method.java:507) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
09-28 02:51:45.501: E/AndroidRuntime(16587): at dalvik.system.NativeStart.main(Native Method) 

误差以线585转的时候,我已经在代码中标明这一点。该行中唯一的2个变量是我和地址,我检查地址是否为空。我不明白为什么我仍然得到空指针异常。

让我知道如果你需要看到的代码。

感谢您花时间阅读本文,并感谢您提供的任何帮助。

+3

您的地址为空。这'地址= geocoder.getFromLocationName(locationName [0],3)'可能失败。并使用活动上下文'Geocoder geocoder = new Geocoder(ActivtiyName.this)' – Raghunandan

回答

2
if(addresses==null || addresses.size()==0){ 
     Toast.makeText(getBaseContext(), "No Location found.Please check address", Toast.LENGTH_SHORT).show(); 
     return; // add this 
} 
+0

谢谢你,完美的工作。 – DrkStr

1

如评论所示,您的addresses变量很可能为空。

您在条件语句中检查addresses是否为null,但您从未实际处理过这种情况。如果addressesnull您所做的只是通过吐司(Toast)通知用户,但稍后的一秒(在吐司的动画甚至加载到屏幕上之前)会导致程序崩溃。

您需要处理的情况addressesnull(即不呼吁变量的方法和尝试填充变量,或完全不同的东西),或者确保它永远不会是null

1

把你的for循环中的其他部分,因为现在即使你的地址为空或address.size = 0 for循环获取与空值执行,并给出NPE

相关问题