【问题标题】:Null pointer exception while parsing JSON in Android在Android中解析JSON时出现空指针异常
【发布时间】:2023-03-31 20:45:01
【问题描述】:

在 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

您能看出这里可能存在什么问题吗?

提前致谢。

【问题讨论】:

  • 我想到的第一个想法是,我希望您编写代码来检查可能失败的操作是否成功,并在它们失败时输出相应的日志消息。 ;)
  • 不要通过在此处发布来调试空指针 :p 如果您了解如何操作,您总是可以自己弄清楚。首先要检查的是行号。
  • 天啊,你为什么只是复制粘贴以前的答案?它不是 result 它在您的代码中是 sb.toString()
  • 这里有很多行号。我应该看哪一个?
  • hehe=D @Stan,你说得对,我太鲁莽了,对不起。感谢所有答案。

标签: android json


【解决方案1】:

您传递给JSONArray 构造函数的字符串对象resultnull。你永远不会改变它的初始值。

【讨论】:

  • 这里是对的小心眼!我应该将“响应”传递给 JSONArray 构造函数吗?
  • 我想你可能想传入sb.toString(),但实际上你比我更了解它应该做什么!
  • 不!因为你有 19.7k 代表,而我有 5 个!我是新手,所以实际上你可以比我更了解我的代码:) 谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 2023-01-26
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
相关资源
最近更新 更多