尝试从异步类android

时间:2016-03-26 15:00:57

标签: java android json nullpointerexception

有人可以解释或纠正我为什么在异步类中获得空指针异常吗?我试图从URL获取数据,但获得162的空指针异常,其中包含以下代码

int lengthJsonArr = jsonMainNode.length();

我不确定为什么会这样,但如果有人可以提供帮助那就太好了。或者,如果有人可以向我展示一个更好的替代方法来从网址获取json数据,那也将是一个很好的帮助。

public class userTask extends AsyncTask<String, Void, Void>{
    HttpURLConnection connection = null;
    private String Content;
    @Override
    protected Void doInBackground(String... urls) {

        BufferedReader reader = null;
        try {
            URL url = new URL(urls[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            } Content = buffer.toString();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return null;
    }

    @Override
    protected void onPostExecute(Void s) {
        super.onPostExecute(s);

        String OutputData = "";
        JSONObject jsonResponse;

        try {
            jsonResponse = new JSONObject(Content);
            JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");

            int lengthJsonArr = jsonMainNode.length(); //This is causing the exception

            for (int i =0; i < lengthJsonArr; i++) {
                JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
                String name = jsonChildNode.optString("name").toString();
                Double longitude = jsonChildNode.optDouble("lon");
                Double latitude = jsonChildNode.optDouble("lat");

                OutputData += " Name : "+ name +" "
                        + "Longitude : "+ longitude +" "
                        + "Latitude  : "+ latitude +" "
                        +"-------------------------------------------------- ";

                //Show Parsed Output on screen (activity)
                Toast toast = Toast.makeText(getApplicationContext(), OutputData, Toast.LENGTH_LONG);
                toast.show();


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

2 个答案:

答案 0 :(得分:1)

这不是在android中获取JSON数据的好方法。您应该使用Volley或Retrofit库。这些库将比普通代码准确有效地工作。

获取数据时需要注意很多事情。一切都将由图书馆完成。而你只需编写几行代码。

你可以在google上关注很多好的教程。

答案 1 :(得分:0)

这有效......

jsonResponse = new JSONObject(Content);

...您至少成功接收到包含有效JSON对象的HTTP响应。

下一行......

JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");

...尝试提取JSON数组,但显然失败了,因此您的jsonMainNode变量为null。这就是optJSONArray()的工作原理。如果找不到要求,它只返回null。 (而不是举例如JSONException。)

然后下一行...

int lengthJsonArr = jsonMainNode.length();

...当然失败了,因为你无法获得 null JSON数组的长度。

因此看起来您收到的JSON不包含名为“Android”的数组。你可以/应该在...上放置一个断点。

JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");

...并检查JSON对象中的内容。或者只是打印出响应。 (并用小写将其命名为“content”,这样人们就不会唠叨Java编码约定......)

至于避免NullPointerException,您可以使用以下代码:

if (jsonResponse.has("Android")) {
    JSONArray jsonMainNode = jsonResponse.optJSONArray("Android");
    int lengthJsonArr = jsonMainNode.length();
    // Etc.
    // ...
}
else {
    // TODO: Recover from the situation.
    // ...

}