2013-10-30 87 views
1

我遇到此問題: 當我啓動我的活動時,由於NullPointerException,無法訪問doInBackground方法。但指針存在,我可以訪問它並將其顯示在System.out 有沒有人看到這裏有什麼問題? 謝謝。doInBackground中的Java NullPointer異常

有我的代碼

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); 
      } 
     }); 

    } 
} 

我在一個單獨的類

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()); 
    } 
} 

} 

下面的方法是我的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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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":"[email protected]","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 
+0

能否請你只是顯示代碼的相關部分? – puelo

+0

請求類中的第94行是什麼? –

+0

也許清除它並建立新的 –

回答

0

正如在評論中討論: 你的方法,getJSONobjectFromURL,具有下面的代碼:JSONObject jObj = new JSONObject(jsonString); 的問題是,這是一個不同jObj到在班級頂部宣佈的那個。因此,當函數結束時,您實際上返回一個空白(空)對象,導致jsonObj在其他類中爲null。

最簡單的解決將是把JSONObject jObj = new JSONObject(jsonString);jObj = new JSONObject(jsonString);

萬一你沒有看到它,這是爲什麼你的作用域不工作的一個很簡單的例子:http://ideone.com/3oJudR

+0

它工作!我有一個顯示問題,因爲只有姓氏是代幣,但我相信我可以解決這個問題。謝謝。 – user2936085

0

我覺得這是你的問題,你的HashMap越來越空

phone.getString(TAG_PHONE_OFFICE); 

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

只是initalize在你的Activity類的onCreate方法上面

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

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

謝謝你的回答。 不幸的是,同樣的錯誤! 我繼續找到.. – user2936085