Android 从URL获取JSON文件时,AsyncTask中出现NullPointerException
我有一个JSON文件,并上传到我的服务器上,然后在我的android应用程序中获取它。但每次我尝试调试我的应用程序时,它都会在AsyncTask类中出现空指针异常,并导致以下错误:Android 从URL获取JSON文件时,AsyncTask中出现NullPointerException,android,json,listview,android-asynctask,nullpointerexception,Android,Json,Listview,Android Asynctask,Nullpointerexception,我有一个JSON文件,并上传到我的服务器上,然后在我的android应用程序中获取它。但每次我尝试调试我的应用程序时,它都会在AsyncTask类中出现空指针异常,并导致以下错误: 10-30 05:07:46.268 8710-9073/com.example.prof_mohamedatef.listview E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 java.lang.RuntimeException: An error occure
10-30 05:07:46.268 8710-9073/com.example.prof_mohamedatef.listview E/AndroidRuntime:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.example.prof_mohamedatef.listview.androidlistviewactivity$FetchUsersDesires.doInBackground(androidlistviewactivity.java:159)
at com.example.prof_mohamedatef.listview.androidlistviewactivity$FetchUsersDesires.doInBackground(androidlistviewactivity.java:84)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
我确信我的设备已连接到internet。我在url中采用了,这可能是错误构建的,它可能需要问号?或任何其他符号,或者我的json文件可能没有正确构建。请查看我的url:和json代码:
{"page":1,"Desires": [{
"hotels": {
"id": "1",
"title": "hotels booking",
"thumb_url": "https://yourbest-online.com/images/xml_files/hotels.png"
},
"Aviation": {
"id": "2",
"title": "Aviation Tickets Booking",
"thumb_url": "https://yourbest-online.com/images/xml_files/aviation.png"
}
],"total_results":2,"total_pages":1}
这是我所有的AsyncTask类,包括问题总是出现的doInBackground方法:
public class FetchUsersDesires extends AsyncTask<String, Void, ArrayList<OptionsEntity>> {
private final String LOG_TAG = FetchUsersDesires.class.getSimpleName();
private ArrayList<OptionsEntity> getUsersDesiresFromJson(String UsersDesires)
throws JSONException {
UsersDesiresJson = new JSONObject(UsersDesires);
UsersDesiresJsonAray = UsersDesiresJson.getJSONArray(main_List);
list.clear();
for (int i = 0; i < UsersDesiresJsonAray.length(); i++) {
// Get the JSON object representing a movie per each loop
oneOptionData = UsersDesiresJsonAray.getJSONObject(i);
ID_STRING = oneOptionData .getString(ID);
TITLE_STRING = oneOptionData .getString(TITLE);
Image_URL_STRING = oneOptionData .getString(Image_URL);
mAdapter=null;
OptionsEntity entity = new OptionsEntity(Image_URL_STRING, TITLE_STRING);
list.add(entity);
}
return list;
}
@Override
protected ArrayList<OptionsEntity> doInBackground(String... params) {
String UsersDesires_JsonSTR = null;
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
if (params.length == 0) {
return null;
}
try {
URL url = new URL(params[0]);
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null) {
UsersDesires_JsonSTR = null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
if (buffer.length() == 0) {
return null;
}
UsersDesires_JsonSTR = buffer.toString();
Log.v(LOG_TAG, "Users Desires String: " + UsersDesires_JsonSTR);
} catch (IOException e) {
Log.e(LOG_TAG, "Error here Exactly ", e);
return null;
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e(LOG_TAG, "Error closing stream", e);
}
}
}
try {
return getUsersDesiresFromJson(UsersDesires_JsonSTR);
} catch (JSONException e) {
Log.e(LOG_TAG, "didn't got Users Desires from getJsonData method", e);
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(ArrayList<OptionsEntity> result) {
if (result != null&& getApplicationContext()!=null) {
mAdapter = new LazyAdapter(getApplicationContext(),R.layout.list_row, result);
listView.setAdapter(mAdapter);
}
}
}
公共类FetchUsersDesires扩展异步任务{
私有最终字符串LOG_TAG=FetchUsersDesires.class.getSimpleName();
私有ArrayList getUsersDesiresFromJson(字符串UsersDesires)
抛出JSONException{
UsersDesiresJson=新的JSONObject(UsersDesires);
usersdesidersjsonaray=usersdesidersjson.getJSONArray(主列表);
list.clear();
对于(int i=0;i
注意,连接现在以最佳方式运行,但出现的JSON异常显示为:“id无值”,android studio中的JSON字符串变量值如下所示:“{”页面“:1,“愿望”:[{
“酒店”:{
“id”:“1”,
“标题”:“酒店预订”,
“拇指url”:”
},
“航空”:{
“id”:“2”,
“标题”:“机票预订”,
“拇指url”:”
}
}],“总结果”:2,“总页数”:1}
“
该值似乎包含每个空格的多个\n\t\t\t符号,我认为这是导致问题的原因,请就此提供任何建议
谢谢你的帮助。谢谢在此处查看
oneOptionData
的值。它没有ID密钥。它要么有旅馆,要么有航空公司
ID_STRING = oneOptionData .getString(ID) ;
因此,这将导致JSON解析异常崩溃。解析异常导致返回null
决不能从用于返回数据列表的AsyncTask返回空列表。相反,您应该返回一个空列表,并在解析错误发生时适当地记录该错误
获取更好的json格式
"Desires": [{
"id": "1",
"category":"hotels",
"title": "hotels booking",
"thumb_url": "https://yourbest-online.com/images/xml_files/hotels.png"
},
{
"id": "2",
"category":" Aviation",
"title": "Aviation Tickets Booking",
"thumb_url": "https://yourbest-online.com/images/xml_files/aviation.png"
}
旁白:JSON文件位于名为
xml\u files
的目录中?在images
下有一个名为xml\u files
的目录?如果这是您的服务器,我建议您也重新组织整个代码,并使用实际的REST API生成JSON,而不是托管纯文本文件您是否因为没有从url获取任何数据而获得空指针异常?或者原因不同!!空指针异常说明了什么?@ginomempin查看编辑空指针异常,不,你的JSON你没有编辑你的JSON。。是吗?它仍然无效。这里有一个建议:使用Gson转换器或OkHttp或Volley进行改造,以满足您的网络请求。在我看来,没有太多理由使用HttpURLConnection。尤其是当您需要处理大量JSON文件时