2015-05-07 66 views
-2

我已經閱讀了許多來自接收到相同異常的人的其他許多主題,但沒有一個建議的解決方案能夠工作。所以這裏是我的問題:Android:JSONParser返回NullPointerException

我想通過我的應用程序中的函數從我的數據庫中下載用戶列表。 JSONParser不斷在數據庫的這個特定表上返回一個NullPointException。我已經成功地在其他查詢中使用了JSONParser類,但它不適用於此類。我測試了處理查詢的PHP文件,它返回我想要的作爲JSON對象的確切值。如果表是空的,它返回:

{ 
    "success":0, 
    "message":"No users found" 
} 

如果表中包含用戶信息,則返回:

{ 
    "success":1, 
    "users":[ 
     {  
      "ID":someID1, 
      "NAME":someName1 
      "PHONE":somePhoneNumber1 
     }, 
     {  
      "ID":someID2, 
      "NAME":someName2 
      "PHONE":somePhoneNumber2 
     }] 
} 

我通過調用

LoadAllUsers load = new LoadAllUsers(); 
load.execute(); 

開始請求一定的方法。這是我的LoadAllUsers類:

public class LoadAllUsers extends AsyncTask<Void, Void, Boolean> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(allUsers.this); 
     pDialog.setMessage("Laden van alle gebruikers..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Void... args) { 
     updateJSONData(); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     super.onPostExecute(result); 
     pDialog.dismiss(); 
     updateList(); 
    } 
} 

我收到我的updateJSONdata()方法的第一線,這是一個NullPointerException異常:

public void updateJSONData() { 
    JSONObject json = jParser.getJSONFromUrl(my_url); 
    try { 
     int success = json.getInt("success"); 
     if (success == 1) { 
      JSONArray users = json.getJSONArray("users"); 
      for (int i = 0; i<users.length(); i++) { 
       JSONObject c = users.getJSONObject(i); 
       String id = c.getString("ID"); 
       String name = c.getString("NAAM"); 
       String phone =c.getString("TELEFOON"); 
       HashMap<String,String> map = new HashMap<String, String>(); 
       map.put("ID",id); 
       map.put("name",name); 
       map.put("phonenumber",phone); 
       if (phoneNumber == phone) { 
        ID = Integer.parseInt(id); 
        this.name = name; 
       } 
       userlist.add(map); 
      } 
     } else { 
      Log.d("Geen succes!", "Helaas!"); 
     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

所以,異常在與jParser行拋出.getJSONFromUrl(...)。 我JSONParser類,它的jParser是一個實例,就是:

public class JSONParser { 
    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 
public JSONParser() { 

} 

public JSONObject getJSONFromUrl(final String url) { 

    // Making HTTP request 
    try { 
     // Construct the client and the HTTP request. 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     // Execute the POST request and store the response locally. 
     HttpResponse httpResponse = httpClient.execute(httpPost); 
     // Extract data from the response. 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     // Open an inputStream with the data content. 
     is = httpEntity.getContent(); 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     // Create a BufferedReader to parse through the inputStream. 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     // Declare a string builder to help with the parsing. 
     StringBuilder sb = new StringBuilder(); 
     // Declare a string to store the JSON object data in string form. 
     String line = null; 

     // Build the string until null. 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 

     // Close the input stream. 
     is.close(); 
     // Convert the string builder data to an actual string. 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // Try to parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // Return the JSON Object. 
    return jObj; 

} 

// function get json from url 
// by making HTTP POST or GET mehtod 
public JSONObject makeHttpRequest(String url, String method, 
            List<NameValuePair> params) { 

    // Making HTTP request 
    try { 

     // check for request method 
     if(method == "POST"){ 
      // request method is POST 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     }else if(method == "GET"){ 
      // request method is GET 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      String paramString = URLEncodedUtils.format(params, "utf-8"); 
      Log.d("Gemaakte paramstring",paramString); 
      url += "?" + paramString; 
      HttpGet httpGet = new HttpGet(url); 

      HttpResponse httpResponse = httpClient.execute(httpGet); 
      Log.d("httpResponse: ",httpResponse.toString()); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     } 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 
} 

}

而且logcat的消息是:

05-07 10:46:24.995 27615-27686/com.example.user.my_app E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
Process: com.example.user.my_app, PID: 27615 
java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:300) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 
Caused by: java.lang.NullPointerException 
     at com.example.user.my_appcenter_tile.updateJSONData(center_tile.java:376) 
     at com.example.user.my_app.center_tile$Memberlist.doInBackground(center_tile.java:419) 
     at com.example.user.my_app.center_tile$Memberlist.doInBackground(center_tile.java:406) 
     at android.os.AsyncTask$2.call(AsyncTask.java:288) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 

我會很感激,如果你能幫助我帶出這個問題。

+0

什麼線是'center_tile.java拼寫錯誤:376'? – shkschneider

+0

這是我的updateJSONdata()方法的第一行: 'JSONObject json = jParser.getJSONFromUrl(my_url);' – Olivier

+1

那麼'jParser'爲空。 – shkschneider

回答

1

那麼,jParserupdateJSONdata()爲空。

確保在使用前檢查它是否爲!= null

如果它不應該是null,那麼修復你的代碼。

你的錯誤只是一個NullPointerException

+1

也許使用'JSONObject json = new JSONParser()。getJSONFromUrl(my_url)'? – shkschneider

+0

確實做到了這個工作。感謝您的幫助! – Olivier

0

您可以使用'has'關鍵字來檢查json鍵的可用性,然後可以解析Json以避免異常,否則可以通過Null指針異常進行跟蹤。

public void updateJSONData() { 
     JSONObject json = jParser.getJSONFromUrl(my_url); 
     try { 
      int success = json.getInt("success"); 
      boolean isAvail=json.has("users"); 
      if (success == 1) { 
       if(isAvail) 
       JSONArray users = json.getJSONArray("users"); 
       for (int i = 0; i<users.length(); i++) { 
        } 
       } 
      } 
     catch(Exception e){ 
     } 
    } 
+0

由於'jParser'爲'null',所以仍然產生'NullPointerException'。 – shkschneider

0

1. jParser是NULL所以使用

// make sure my_url has json string in it 
// read json first and use in place of my_url 
JSONObject jsonObjTokener = (JSONObject) new JSONTokener(my_url).nextValue(); 
// get success 
String isSuccess = jsonObjTokener.getString("success"); 
// get users 
JSONObject mUser = jsonObjTokener.getJSONObject("users"); 

在該行

2。你們在

String name = c.getString("NAAM"); 

正確

String name = c.getString("NAME"); 
相關問題