-2

I have published an app using Fabric Crashlytics and in these last days I'm receiving this error crash user:

Fatal Exception: java.lang.NullPointerException Attempt to invoke virtual method 'void ...android.controller.CustomListAdapter.notifyDataSetChanged()' on a null object reference

and the code of fragment impacted is this:

private void loadListView(String response,float lowerLimit,float upperLimit)
{
    //Log.e("test", "loadList:"+response);
    if(Globals.geoJsonResponse.size() == 0)
    {
        //Log.e("test", "aaa:"+Globals.geoJsonResponse.size());
        try {
            JSONObject featureCollection=new JSONObject(response);
            try{
                FirstProjectApplication.mSearchSubTitle =  featureCollection.getString("subTitle");
                getActivity().getActionBar().setSubtitle(FirstProjectApplication.mSearchSubTitle);
            }catch(Exception e){}
            globalResponseObject.clear();
            popupResponseObject.clear();
            JSONArray features=featureCollection.getJSONArray("features");
            for (int i = 0; i < features.length(); i++) {

                JSONObject properties=features.getJSONObject(i);
                String type = properties.getJSONObject("properties").getString("type");
                String author = properties.getJSONObject("properties").getString("author");
                float mag=Float.parseFloat(properties.getJSONObject("properties").getString("mag"));


                SimpleDateFormat  format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
                Date date1 = format.parse(properties.getJSONObject("properties").getString("time"));

                GeoJsonResponse obj=new GeoJsonResponse(
                        properties.getJSONObject("properties").getString("eventId"),
                        properties.getJSONObject("properties").getString("author"),
                        properties.getJSONObject("properties").getString("place"),
                        Double.parseDouble(properties.getJSONObject("properties").getString("mag")),
                        Double.parseDouble(properties.getJSONObject("geometry").getJSONArray("coordinates").getString(2)),
                        properties.getJSONObject("properties").getString("time"),date1,
                        Double.parseDouble(properties.getJSONObject("geometry").getJSONArray("coordinates").getString(1)),  //lat,lon is reversed
                        Double.parseDouble(properties.getJSONObject("geometry").getJSONArray("coordinates").getString(0))


                );

                if(author.equals("AUTOMATIC")) {
                    popupResponseObject.add(obj);
                } else {
                    if((mag>=lowerLimit&&mag<upperLimit)) {
                        globalResponseObject.add(obj);
                        //Log.e("test", "mag:"+mag);
                    }
                    Globals.geoJsonResponse.add(obj);
                }
            }
            //  Collections.sort(globalResponseObject, new DateSorter());
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            //Log.e("test", e.getLocalizedMessage());
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            //Log.e("test", e.getLocalizedMessage());
        }

        sort();
        adpater=new  CustomListAdapter(getActivity(), globalResponseObject);
        geoJSON.setAdapter(adpater);
        //Log.e("test", "bbb:"+globalResponseObject.size());
    } else {
        //Log.e("test", "bbb:"+globalResponseObject.size());
        globalResponseObject.clear();
        for(GeoJsonResponse geo_response:Globals.geoJsonResponse)
        {
            if((geo_response.getMagnitude()>=lowerLimit&&geo_response.getMagnitude()<upperLimit)) globalResponseObject.add(geo_response);
        }
        sort();
        adpater.notifyDataSetChanged();
    }

    if(globalResponseObject.size() == 0) {
        new AlertDialog.Builder(getActivity(),R.style.AppCompatAlertDialogStyle)
                .setTitle(getString(R.string.allert))
                .setMessage(getString(R.string.allertsms ))
                .setPositiveButton("Ok",null)
                .show();


    }
}

the line error is adpater.notifyDataSetChanged(); On my device i doesn't have any crash. Any help please? Thanks

Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
APPGIS
  • 353
  • 1
  • 10
  • 20
  • 1. See where you're initializing `adpater`. 2. See where you are using `adpater`. 3. Reason how the latter could happen before the former in your code. – laalto Feb 22 '18 at 15:38

2 Answers2

2

the error is due to this else part. it happens when this if(Globals.geoJsonResponse.size() == 0) is not satisfied.

else {
    //Log.e("test", "bbb:"+globalResponseObject.size());
    globalResponseObject.clear();
    for(GeoJsonResponse geo_response:Globals.geoJsonResponse)
    {
        if((geo_response.getMagnitude()>=lowerLimit&&geo_response.getMagnitude()<upperLimit)) globalResponseObject.add(geo_response);
    }
    sort();
    adpater.notifyDataSetChanged();
}

you have to initialize the adapter also in this block or outside your request method.

also, read this

Bishoy Kamel
  • 2,327
  • 2
  • 17
  • 29
1

I think that you don't have your adapter initialize. You only initialize it

    if ( Globals.geoJsonResponse.size() == 0 ) {
        ....
        adpater=new  CustomListAdapter(getActivity(), globalResponseObject);
        geoJSON.setAdapter(adpater);
    } else {
        ....
        adpater.notifyDataSetChanged();
    }
Sol
  • 833
  • 1
  • 9
  • 17