2013-04-26 109 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

相关问题