8

I'm creating an app that display contact list in a listview.The problem is I'm getting the following error when I run my app and I'm struggling to fix it:

04-05 13:41:48.868 2488-2488/? E/AndroidRuntime: FATAL EXCEPTION: main
                                             Process: com.kksworld.jsonparsing, PID: 2488
                                             java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
                                                 at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:337)
                                                 at android.widget.ListView.setAdapter(ListView.java:491)
                                                 at com.kksworld.jsonparsing.MainActivity$JSONTask.onPostExecute(MainActivity.java:120)
                                                 at com.kksworld.jsonparsing.MainActivity$JSONTask.onPostExecute(MainActivity.java:48)
                                                 at android.os.AsyncTask.finish(AsyncTask.java:651)
                                                 at android.os.AsyncTask.-wrap1(AsyncTask.java)
                                                 at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:148)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)

Here is my code :

MainActivity.java

package com.kksworld.jsonparsing;
import android.content.Context;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import com.kksworld.jsonparsing.models.ContactModel;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private ListView listView;

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

    listView = (ListView)findViewById(R.id.lvContacts)
    }


public class JSONTask extends AsyncTask<String,String,List<ContactModel>>{

    @Override
    protected List<ContactModel> doInBackground(String... params) {

        HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;

        try {
            URL url = new URL(params[0]);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.connect();
            InputStream inputStream = httpURLConnection.getInputStream();
            // Through this we can read the data line by line
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";
            while ((line = bufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }

            String finalJSON = stringBuffer.toString();
            JSONArray mainArray = new JSONArray(finalJSON);
            JSONObject parentObject = mainArray.getJSONObject(0);
            JSONArray parentArray = parentObject.getJSONArray("contacts");

            List<ContactModel> contactModelList = new ArrayList<>();

            // For parsing a list of items you have to use for loop
            for(int i=0;i<11;i++) {
                JSONObject finalObject = parentArray.getJSONObject(i);
                ContactModel contactModel = new ContactModel();
                contactModel.setName(finalObject.getString("name"));
                contactModel.setPhone(finalObject.getString("phone"));
                contactModel.setEmail(finalObject.getString(("email")));
                contactModel.setOfficePhone(finalObject.getString(("officePhone")));
                contactModel.setLatitude((float) finalObject.getDouble("latitude"));
                contactModel.setLongitude((float) finalObject.getDouble("longitude"));
                // Adding the finalObject in the List
                contactModelList.add(contactModel);

            }
            return contactModelList;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (httpURLConnection != null) {
                httpURLConnection.disconnect();
                try {
                    if (bufferedReader != null) {
                        bufferedReader.close();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    // Value returned by doInBackGround will be passed here...

    @Override
    protected void onPostExecute(List<ContactModel> result) {
        super.onPostExecute(result);

        ContactAdapter contactAdapter = new ContactAdapter(getApplicationContext(),R.layout.row,result);
        listView.setAdapter(contactAdapter);
    }
}

public class ContactAdapter extends ArrayAdapter{

    private List<ContactModel> contactModelList;
    private int resource;
    private LayoutInflater inflater;

    public ContactAdapter(Context context, int resource, List<ContactModel> objects) {
        super(context, resource, objects);
        contactModelList=objects;
        this.resource=resource;
        inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if(convertView == null)
        {
            convertView = inflater.inflate(resource,null);
        }
        TextView textViewName;
        TextView textViewEmail;
        TextView textViewPhone;
        TextView textViewOfficePhone;

        textViewName = (TextView)convertView.findViewById(R.id.textViewInsertName);
        textViewEmail= (TextView)convertView.findViewById(R.id.textViewInsertEmail);
        textViewPhone= (TextView)convertView.findViewById(R.id.textViewInsertPhone);
        textViewOfficePhone = (TextView)convertView.findViewById(R.id.textViewInsertOfficeNumber);

        textViewName.setText(contactModelList.get(position).getName());
        textViewEmail.setText(contactModelList.get(position).getEmail());
        textViewPhone.setText(contactModelList.get(position).getPhone());
        textViewOfficePhone.setText(contactModelList.get(position).getOfficePhone());

        return convertView;
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_refresh) {
        new JSONTask().execute("some_url");
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

Could someone please help.

3
  • My guess is the response from your HTTP call is not parsing as JSON, probably hitting a JSONException in your AsyncTask, which causes your task to return null...which you then feed to your ContactAdapter and triggers the NullPointerException. Commented Apr 5, 2016 at 18:24
  • any chance contactModelList being passed from doInBackground() to onPostExecute() is null? Commented Apr 5, 2016 at 18:25
  • The exact explanation of how you are getting NullPointerException at ArrayAdapter.getCount() can be found here. stackoverflow.com/questions/36212453/… Commented Apr 5, 2016 at 18:37

4 Answers 4

25

Extract this line

List<ContactModel> contactModelList = new ArrayList<>();

before the try block and instead of return null; use return contactModelList;

Looks like your parsing fails and you pass a null object to onPostExecute().

Sign up to request clarification or add additional context in comments.

Comments

2

The List object which you passed into the adapter is null. So when the adapter calls list.Size(), a null pointer exception is thrown.

Use a debugger, set a breakpoint somewhere around com.kksworld.jsonparsing.MainActivity$JSONTask.onPostExecute(MainActivity.java:48), and work your way backward from there if you can't figure it out.

One assumes that your json parse failed somehow or another.

Comments

1

Perhaps someone else will look for an answer. This method also works as error prevention

public int getItemCount() {
        if(list==null) return 0;
        return list.size();
    }

Comments

0

I was building similar app from youtube video and I've got same error, but I saw also error "Cleartext HTTP traffic not allowed to site.com", so I found solution android:usesCleartextTraffic="true" here Android 8: Cleartext HTTP traffic not permitted and it solved all problems without modifying MainActivity. Btw, on API 16 it wasn't showing errors.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.