2013-09-27 4 views
0

Привет всем, У меня есть задача Async для указания точки на карте на основе введенного пользователем адреса. У меня есть исключение NullPointerException в onPostExecute, и я могу понять, почему. Вот класс асинхроннойNullPointerException в моей AsyncTask

 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 переменными в этой строке являются i и адрес, и я проверяю, имеет ли адрес нуль. Я не понимаю, почему я все еще получаю исключение с нулевым указателем.

Дайте мне знать, если вам нужно больше узнать код.

Спасибо, что нашли время, чтобы прочитать это и за любую помощь, которую вы можете дать.

+3

ваши адреса является нулевым. это 'address = geocoder.getFromLocationName (locationName [0], 3)' fail возможно. и использовать контекст действия '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, скорее всего, не указана.

Вы проверяете, является ли addressesnull в условном выражении, но вы никогда не справляетесь с этой ситуацией. Если addresses - это null, все, что вы делаете, уведомляет пользователя через Toast, но FRACTION через секунду (до того, как анимация Toast даже загружена на вашем экране) ваша программа выйдет из строя.

Вы должны справиться с ситуацией, когда addresses является null (то есть, не вызывать методы переменной и попытаться заполнить переменную, или нечто совсем другое), или убедитесь, что он никогда не является null.

1

Поместите свой цикл в еще отчасти потому, что прямо сейчас, даже если ваши адреса является нулевым или address.size = 0 для цикла запускается на выполнение с нулевым значением и дает NPE

Смежные вопросы