2013-04-26 63 views
0

在Android上解析JSON時,出現空指針異常。在Android中解析JSON時出現空指針異常

這就是我想要解析JSON:

[{"value":"91.84","timestamp":"2012-10-11 14:12:13"}] 

這裏是我解析的方式:

InputStream inputStream = null; 
String result = null; 
HttpResponse response; 
BufferedReader reader; 
JSONObject jObject; 
String aJsonString1; 
String aJsonString2; 


public class ReadJSON extends AsyncTask<String, Void, String> { 
    protected String doInBackground(String... url) { 

     DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
     HttpPost httppost = new HttpPost("url is written here"); 
     // Depends on your web service 
     httppost.setHeader("Content-type", "application/json"); 
     try { 
      response = httpclient.execute(httppost);  
      HttpEntity entity = response.getEntity(); 
      inputStream = entity.getContent(); 
      reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 

     while ((line = reader.readLine()) != null) 
      { 
       sb.append(line + "\n"); 
      } 


     JSONArray jsonArray = new JSONArray(result); 

     for (int i=0; i < jsonArray.length(); i++) 
      { 
       JSONObject oneObject = jsonArray.getJSONObject(i); 
       // Pulling items from the array 
       String oneObjectsItem = oneObject.getString("value"); 
       String oneObjectsItem2 = oneObject.getString("timestamp"); 
      } 

     aJsonString1 = jsonArray.getJSONObject(0).getString("value"); 
     aJsonString2 = jsonArray.getJSONObject(0).getString("timestamp"); 


     return aJsonString1; 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      Log.e("JSON",e.getMessage() + " " + e); 
     }   
     return null; // Error case 

    } 

    protected void onPostExecute(String result) { 
     textView.setText(aJsonString1); 

     if(aJsonString1==null){ 
      textView.setText("nothing to show"); 
     } 

    } 

這是堆棧跟蹤我得到:

04-26 15:37:40.930: E/AndroidRuntime(1387): FATAL EXCEPTION: AsyncTask #1 
04-26 15:37:40.930: E/AndroidRuntime(1387): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.lang.Thread.run(Thread.java:856) 
04-26 15:37:40.930: E/AndroidRuntime(1387): Caused by: java.lang.NullPointerException 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at org.json.JSONTokener.nextValue(JSONTokener.java:94) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at org.json.JSONArray.<init>(JSONArray.java:87) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at org.json.JSONArray.<init>(JSONArray.java:103) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at com.example.ayasms.MainActivity$ReadJSON.doInBackground(MainActivity.java:176) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at com.example.ayasms.MainActivity$ReadJSON.doInBackground(MainActivity.java:1) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
04-26 15:37:40.930: E/AndroidRuntime(1387):  ... 4 more 

你能看到什麼可能是這裏的問題?

在此先感謝。

+0

我想到的第一個想法是我希望你編寫代碼來檢查可能失敗的操作是否成功,並在失敗時輸出相應的日誌消息。 ;) – 2013-04-26 12:51:01

+0

不要通過在這裏發佈來調試nullpointers:p如果你學習如何,你總是可以自己弄明白。首先要檢查的是行號。 – keyser 2013-04-26 12:51:34

+0

OMG你爲什麼剛剛複製粘貼以前的答案?它不在代碼中產生'sb.toString()' – Stan 2013-04-26 12:55:11

回答

3

您傳遞給JSONArray構造函數的字符串對象resultnull。你永遠不會改變它的初始價值。

+0

這就是小心眼睛在這裏!我應該將「響應」傳遞給JSONArray構造函數嗎? – 2013-04-26 12:55:03

+0

我想你可能想傳入'sb.toString()',但是你真的知道我應該做什麼比做更多! – 2013-04-26 12:56:27

+0

不!因爲你有19.7k代表,我有5!我是一個新手,所以實際上你可以比我更瞭解我的代碼:)感謝您的幫助。 – 2013-04-26 13:05:32

相關問題