有人可以解释或纠正我为什么在异步类中获得空指针异常吗?我试图从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();
}
}
}
答案 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.
// ...
}