2016-05-05 2 views
-3

Я создаю приложение, которое будет отображать множественное расположение на карте Google, и я прочитал его через файл csv. У меня ошибка в методе OnCreate и mixedarArrayList.В моем приложении есть ошибка

Это ошибка:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference 
at com.w2s.where2shop.ShowAllMap$CSVFile.displayArrayList(ShowAllMap.java:267) 
at com.w2s.where2shop.ShowAllMap.onCreate(ShowAllMap.java:65) 
at android.app.Activity.performCreate(Activity.java:5975) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
at android.app.ActivityThread.access$800(ActivityThread.java:147) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5264) 
at java.lang.reflect.Method.invoke(Native Method) 

Это OnCreate

private InputStream inputStream; 
private CSVFile csvFile; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_show_all_map); 
    setUpMapIfNeeded(); 
    inputStream = getResources().openRawResource(R.raw.allmap); 
    csvFile = new CSVFile(inputStream); 
    csvFile.read(); 
    try { 
     csvFile.displayArrayList(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 

    // Create the LocationRequest object 
    mLocationRequest = LocationRequest.create() 
      .setPriority(LocationRequest.PRIORITY_LOW_POWER) 
      .setNumUpdates(1); 


} 

И это, где я прочитал мой файл CSV и внутри класса CsvFile я получил метод displayarrayItem.

public class CSVFile { 
    InputStream inputStream; 
    ArrayList<String[]> addressList; 


    public CSVFile(InputStream is) { 
     this.inputStream = is; 
    } 

    public ArrayList<String[]> read() { 
     ArrayList<String[]> addressList = new ArrayList<>(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
     try { 
      String line; 
      while ((line = reader.readLine()) != null) { 
       String[] row = line.split(","); 
       addressList.add(row); 
      } 
     } catch (IOException e) { 
      Log.e("Main", e.getMessage()); 
     } finally { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       Log.e("Main", e.getMessage()); 
      } 
     } 
     return addressList; 
    } 

    public ArrayList<String[]> displayArrayList() throws IOException { 
     for (int x = 0; x > this.addressList.size(); x++) { 

      Geocoder gc = new Geocoder(ShowAllMap.this); 
      List<Address> list = gc.getFromLocationName(addressList.get(x).toString(), 1); 

      if (list.size() > 0) { 
       Address add = list.get(0); 
       double lat = add.getLatitude(); 
       double lng = add.getLongitude(); 
       LatLng latLng = new LatLng(lat, lng); 

       MarkerOptions options = new MarkerOptions() 
         .position(latLng); 
       mMap.animateCamera(CameraUpdateFactory.zoomIn()); 
       mMap.addMarker(options); 


      } 
     } 
     return addressList; 
    } 

} 
+0

ArrayList АдресList; у вас есть diclared arraylist, но еще не экземпляр. – Srinivasan

+2

в 'CSVFile.read()' method replace 'ArrayList addressList = new ArrayList <>(); 'с' addressList = new ArrayList <>(); 'ваш локальный var скрывает ваше поле, потому что имеет то же имя и ваше поле в null все время – john

+0

Спасибо за hlp, теперь он не имеет ошибки. Но когда я запускаю приложение. Нет маркера. – Critako

ответ

1

Вы объявили о глобальной ArrayList, но вы также создали тот же список массива в методе чтения(), поэтому удалить объявление, а также убедитесь, что ArrayList не является нулевым в displayArrayList() метод.

public class CSVFile { 
     InputStream inputStream; 
     ArrayList<String[]> addressList; 


     public CSVFile(InputStream is) { 
      this.inputStream = is; 
     } 

     public ArrayList<String[]> read() { 
      addressList = new ArrayList<>(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
      try { 
       String line; 
       while ((line = reader.readLine()) != null) { 
        String[] row = line.split(","); 
        addressList.add(row); 
       } 
      } catch (IOException e) { 
       Log.e("Main", e.getMessage()); 
      } finally { 
       try { 
        inputStream.close(); 
       } catch (IOException e) { 
        Log.e("Main", e.getMessage()); 
       } 
      } 
      return addressList; 
     } 

     public ArrayList<String[]> displayArrayList() throws IOException { 
     if(addressList != null){ 
      for (int x = 0; x > this.addressList.size(); x++) { 

       Geocoder gc = new Geocoder(ShowAllMap.this); 
       List<Address> list = gc.getFromLocationName(addressList.get(x).toString(), 1); 

       if (list.size() > 0) { 
        Address add = list.get(0); 
        double lat = add.getLatitude(); 
        double lng = add.getLongitude(); 
        LatLng latLng = new LatLng(lat, lng); 

        MarkerOptions options = new MarkerOptions() 
          .position(latLng); 
        mMap.animateCamera(CameraUpdateFactory.zoomIn()); 
        mMap.addMarker(options); 


       } 
      } 
      } 
      return addressList; 
     } 

    } 
+0

Спасибо, у него нет ошибок, но маркер не показывает – Critako

1

for (int x = 0; x > this.addressList.size(); x++) изменения в for (int x = 0; x < this.addressList.size(); x++) в displayArrayList()

0

Объем вашего ArrayList ArrayList<String[]> addressList = new ArrayList<>(); является локальным. Вне метода чтения ваш ArrayList не определен, поэтому вы получаете эту ошибку.

Sol. Объявите свой ArrayList в onCreate перед вызовом методов read() и displayArraylist().

это может вам помочь.

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