简体   繁体   中英

Java NullPointer Exception in doInBackground

I have this problem: When I launch my activity, it cannot access to the doInBackground method due to a NullPointerException. But the pointer exists, I can access to it and display it in System.out Do anyone see what kind of problem is here ? Thanks.

There is my code

public class Request extends ListActivity{

private static String DEBUG_TAG = "Request";
private ArrayList<HashMap<String, String>> contactList;
private ProgressDialog pDialog;

// url to make request
private static String url = "http://10.0.2.2:1234/?query=ma";
private InputStream is=null;

// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";

// contacts JSONArray
JSONArray contacts = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.response_display);

    contactList = new ArrayList<HashMap<String, String>>();
    new LoadAllData().execute(url);

    ListView lv = getListView();

}

class LoadAllData extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.i("MyAsyncTask","MyAsyncTask Started");
        pDialog = new ProgressDialog(Request.this);
        pDialog.setMessage("Loading Data. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
        Log.i("MyAsyncTask",args[0] + " in background.");
        GetJSONFromUrl instance = new GetJSONFromUrl();
        JSONObject jsonObj = instance.getJSONobjectFromURL(args[0]);
        try {
            contacts = jsonObj.getJSONArray(TAG_CONTACTS);

            // looping through All Contacts
            for(int i = 0; i < contacts.length(); i++) {
                JSONObject c = contacts.getJSONObject(i);
                // Storing each json item in variable
                String id = c.getString(TAG_ID);
                String name = c.getString(TAG_NAME);
                String email = c.getString(TAG_EMAIL);
                c.getString(TAG_ADDRESS);
                c.getString(TAG_GENDER);

                // Phone number is agin JSON Object
                JSONObject phone = c.getJSONObject(TAG_PHONE);
                String mobile = phone.getString(TAG_PHONE_MOBILE);
                phone.getString(TAG_PHONE_HOME);
                phone.getString(TAG_PHONE_OFFICE);

                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                // adding each child node to HashMap key => value
                map.put(TAG_ID, id);
                map.put(TAG_NAME, name);
                map.put(TAG_EMAIL, email);
                map.put(TAG_PHONE_MOBILE, mobile);

                // adding HashList to ArrayList
                contactList.add(map);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;

    }

    protected void onPostExecute() {
        Log.i("MyAsyncTask","onPostExecute ");
        pDialog.dismiss();
        runOnUiThread(new Runnable() {
        public void run() {
            ListAdapter adapter = new SimpleAdapter(Request.this,contactList, 
                                                    R.layout.list_item, 
                                                    new String[] { TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE },
                                                    new int[]{R.id.name, R.id.email, R.id.mobile });
            setListAdapter(adapter);
            }
        });

    }   
}

My method in a separate class

public class GetJSONFromUrl {

private static final String DEBUG_TAG = "GetJSONFromUrl";
private static InputStream myinputstream; 
private InputStream is = null;
private JSONObject jObj;
private String jsonString="";

//Constructor 
public GetJSONFromUrl(){
}

public JSONObject getJSONobjectFromURL(String url){ 
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        Log.i(DEBUG_TAG,"Connection established");
        ObjectMapper anObjectMapper = new ObjectMapper(); 
        JsonParser parser;
        JsonNode node;
        Log.i(DEBUG_TAG,"Initializing catchJSON");
        try {
            JsonFactory jsonfactory = anObjectMapper.getFactory();
            parser = jsonfactory.createParser(is);
            node = parser.readValueAsTree();
            jsonString = anObjectMapper.writeValueAsString(node);
            JSONObject jObj = new JSONObject(jsonString);
            System.out.println("Result = " + jObj.toString());          

        } catch (JsonProcessingException e) {
            Log.i(DEBUG_TAG,"JsonProcessingException " + e);
        } catch (IOException e) {
            Log.i(DEBUG_TAG,"IOException " + e);
        } catch (JSONException e) {
            Log.i(DEBUG_TAG,"JSONException " + e);
        }
        is.close();

    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }
    return jObj;
}

public void catchValueFromJson(String url){
    JsonFactory jsonfactory = new JsonFactory();
    JsonParser jParser;
    try {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(url);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        jParser = jsonfactory.createParser(myinputstream);
        //loop
        while (jParser.nextToken() != JsonToken.END_ARRAY){
            while (jParser.nextToken() != JsonToken.END_OBJECT){
            String fieldname = jParser.getCurrentName();
            if("id".equals(fieldname)){
                // current token is "id",
                // move to next, which is "name"'s value
                jParser.nextToken();
                System.out.println(jParser.getText());
            }
            if ("name".equals(fieldname)) {
                  jParser.nextToken();
                  System.out.println(jParser.getText()); 
                }
            if ("email".equals(fieldname)) {
                  jParser.nextToken();
                  System.out.println(jParser.getText()); 
                }
            if ("address".equals(fieldname)) {
                  jParser.nextToken();
                  System.out.println(jParser.getText());
                }
            if ("gender".equals(fieldname)) {
                  jParser.nextToken();
                  System.out.println(jParser.getText());
                }

                if ("phone".equals(fieldname)) {
                  jParser.nextToken(); // current token is "{", move next
                  // messages is array, loop until token equal to "]"
                  while (jParser.nextToken() != JsonToken.END_OBJECT) {
                    String phonetype = jParser.getCurrentName();
                    if ("mobile".equals(phonetype)) {
                      jParser.nextToken();
                      System.out.println(jParser.getText()); 
                    }
                    if ("home".equals(phonetype)) {
                      jParser.nextToken();
                      System.out.println(jParser.getText());
                    }
                    if ("office".equals(phonetype)) {
                      jParser.nextToken();
                      System.out.println(jParser.getText());
                    }
                  }
                }
                }/* fin du deuxième while*/
        }/* fin du premier while*/

    } catch (JsonParseException e) {
        Log.e("log_tag", "Error JSONParse " + e.toString());
    } catch (IOException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }
}

}

Here it is my LogCat

10-30 12:26:24.474: I/MyAsyncTask(1712): MyAsyncTask Started
10-30 12:26:24.693: I/MyAsyncTask(1712): http://10.0.2.2:1234/?query=ma in background.
10-30 12:26:24.893: W/EGL_emulation(1712): eglSurfaceAttrib not implemented
10-30 12:26:24.998: W/EGL_emulation(1712): eglSurfaceAttrib not implemented
10-30 12:26:25.154: D/dalvikvm(1712): GC_CONCURRENT freed 121K, 2% free 8236K/8391K,         paused 20ms+6ms, total 84ms
10-30 12:26:25.254: I/GetJSONFromUrl(1712): Connection established
10-30 12:26:25.664: I/GetJSONFromUrl(1712): Initializing catchJSON
10-30 12:26:26.443: D/dalvikvm(1712): GC_CONCURRENT freed 268K, 5% free 8415K/8775K, paused 15ms+23ms, total 160ms
10-30 12:26:26.623: I/System.out(1712): Result = {"contacts":   [{"id":"c200","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"ravi@gmail.com","name":"Ravi Tamada"},{"id":"c201","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"johnny_depp@gmail.com","name":"Johnny Depp"},{"id":"c202","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"leonardo_dicaprio@gmail.com","name":"Leonardo Dicaprio"},{"id":"c203","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"john_wayne@gmail.com","name":"John Wayne"},{"id":"c204","gender":"female","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"angelina_jolie@gmail.com","name":"Angelina Jolie"},{"id":"c205","gender":"female","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"dido@gmail.com","name":"Dido"},{"id":"c206","gender":"female","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"adele@gmail.com","name":"Adele"},{"id":"c207","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"hugh_jackman@gmail.com","name":"Hugh Jackman"},{"id":"c208","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"will_smith@gmail.com","name":"Will Smith"},{"id":"c209","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"clint_eastwood@gmail.com","name":"Clint Eastwood"},{"id":"c2010","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"barack_obama@gmail.com","name":"Barack Obama"},{"id":"c2011","gender":"female","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"kate_winslet@gmail.com","name":"Kate Winslet"},{"id":"c2012","gender":"male","phone":{"office":"00 000000","home":"00 000000","mobile":"+91 0000000000"},"address":"xx-xx-xxxx,x - street, x - country","email":"eminem@gmail.com","name":"Eminem"}]}
10-30 12:26:26.633: W/dalvikvm(1712): threadid=12: thread exiting with uncaught exception (group=0xb4e61288)
10-30 12:26:26.663: E/AndroidRuntime(1712): FATAL EXCEPTION: AsyncTask #1
10-30 12:26:26.663: E/AndroidRuntime(1712): java.lang.RuntimeException: An error occured while executing doInBackground()
10-30 12:26:26.663: E/AndroidRuntime(1712):     at   android.os.AsyncTask$3.done(AsyncTask.java:299)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.lang.Thread.run(Thread.java:856)
10-30 12:26:26.663: E/AndroidRuntime(1712): Caused by: java.lang.NullPointerException
10-30 12:26:26.663: E/AndroidRuntime(1712):     at com.example.test_bug.Request$LoadAllData.doInBackground(Request.java:94)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at com.example.test_bug.Request$LoadAllData.doInBackground(Request.java:1)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-30 12:26:26.663: E/AndroidRuntime(1712):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-30 12:26:26.663: E/AndroidRuntime(1712):     ... 5 more
10-30 12:26:27.114: I/MainActivity(1712): OnCreate_initialize_buttons_and_fields
10-30 12:26:27.114: I/MainActivity(1712): autoCompleteEnd
10-30 12:26:27.204: W/EGL_emulation(1712): eglSurfaceAttrib not implemented

I think this is your problem your HashMap getting null

   phone.getString(TAG_PHONE_OFFICE);

                // creating new HashMap
             ->   HashMap<String, String> map = new HashMap<String, String>();

just initalize the above the onCreate method of your Activity class

change it to -> HashMap<String,String> map=new HashMap<String, String>();  

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); 

As discussed in the comments: Your method, getJSONobjectFromURL , has the following code: JSONObject jObj = new JSONObject(jsonString); The problem is this is a different jObj to the one declared at the top of the class. Because of this, when you return jObj at the end of the function, you are actually returning a blank (null) object, causing jsonObj to be null in your other class.

The simplest fix would be to turn JSONObject jObj = new JSONObject(jsonString); into jObj = new JSONObject(jsonString);

Just in case you don't see it, here is a very simple example of why your scoping is not working: http://ideone.com/3oJudR

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM