Android AsyncTask OnPostExecute中的NullPointerException

Android AsyncTask OnPostExecute中的NullPointerException,android,Android,我是android新手。我在执行正确的onPostExecute时得到了data=null。现在我只想显示一个没有可用数据的对话框。但是我得到了NullPointerException public class GetPreviousChatNewThread extends AsyncTask<Void,Void,Void> { ProgressDialog dialog; ArrayList<HashMap<Strin

我是android新手。我在执行正确的onPostExecute时得到了
data=null
。现在我只想显示一个没有可用数据的对话框。但是我得到了
NullPointerException

public class GetPreviousChatNewThread extends AsyncTask<Void,Void,Void> {

            ProgressDialog dialog;
            ArrayList<HashMap<String,String>> data;

            @Override
            protected  Void doInBackground(Void... void1) {
                data=new ArrayList<HashMap<String,String>>();
                data=HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
                        "ReturnUserAdminChats",
                        "admin",
                        "You" ,
                        "a",
                        clientEmail,
                        UserAdminChatActivity.LastShowingChatDate));
                return null;
            }

            @Override
             protected void onPostExecute(Void result) {

                super.onPostExecute(result);


                if(!data.isEmpty())      // <-- error here
                {   
                    adapter.InsertValuesAtTop(data);
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
                }
                if(dialog.isShowing())
                 dialog.dismiss();

             }

            @Override
             protected void onPreExecute() {
                 dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
             }

        }
编辑:

以下是HandleJson的代码:

public class HandleJSON {

private static ArrayList<HashMap<String,String>> chat;
static final String Key_username="username_key";
static final String Key_email="email_key";
static final String Key_messageText="messageText_key";
static final String Key_messageDate="messageDate_key";
static final String Key_messageCounts="messageCount_key";
static boolean newObject;

public static ArrayList<HashMap<String,String>>  ParseJsonForLatestChats(String jsonData)
{
       try {

           if(HandleJSON.newObject)
           {
               chat=new ArrayList<HashMap<String,String>>();
           }
           Log.i("jsonReturned",jsonData.toString());
           JSONArray jsonarr=new JSONArray(jsonData);
            for(int i=0;i<jsonarr.length();i++)
            {   
                HashMap<String,String> hashMap=new HashMap<String,String>();

                hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username"));
                hashMap.put(HandleJSON.Key_email, jsonarr.getJSONObject(i).getString("email"));
                hashMap.put(HandleJSON.Key_messageCounts, jsonarr.getJSONObject(i).getString("count"));

                chat.add(hashMap);

            }

            return chat;
      }
      catch(JSONException e)
      {
          Log.e("JsonDek", e.getMessage());
          return null;
      }
}

public static ArrayList<HashMap<String,String>>  ParseJsonForUserAdminChats(String jsonData)
{

       chat=new ArrayList<HashMap<String,String>>();

try {

         JSONArray jsonarr=new JSONArray(jsonData);
         Log.i("GoTo Json",jsonData);
            UserAdminChatActivity.LastShowingChatDate=jsonarr.getJSONObject(0).getString("chatDate");
            for(int i=jsonarr.length()-1;i>=0;i--)
            {   
                HashMap<String,String> hashMap=new HashMap<String,String>();

                hashMap.put(HandleJSON.Key_username, jsonarr.getJSONObject(i).getString("username"));
                hashMap.put(HandleJSON.Key_messageText, jsonarr.getJSONObject(i).getString("chatText"));
                hashMap.put(HandleJSON.Key_messageDate, jsonarr.getJSONObject(i).getString("chatDate"));
                Log.i("dateeeeeee",jsonarr.getJSONObject(i).getString("chatDate"));

                chat.add(hashMap);

            }


            return chat;
      }
      catch(JSONException e)
      {
          return null;
      }
}


public static ArrayList<String> ReturnUsersEmail(String jsonData) throws JSONException
{
    JSONArray jsonarr=new JSONArray(jsonData);
    ArrayList<String> emails=new ArrayList<String>();

    for(int i=0;i<jsonarr.length();i++)
    {
        emails.add(jsonarr.getString(i));
    }

    return emails;
}


}
public类HandleJSON{
私有静态数组列表聊天;
静态最终字符串键\u username=“username\u Key”;
静态最终字符串Key\u email=“email\u Key”;
静态最终字符串键\u messageText=“messageText\u Key”;
静态最终字符串键\u messageDate=“messageDate\u Key”;
静态最终字符串键\u messageCounts=“messageCount\u Key”;
静态布尔对象;
公共静态ArrayList ParseJsonForLatestChats(字符串jsonData)
{
试一试{
if(HandleJSON.newObject)
{
chat=newarraylist();
}
i(“jsonReturned”,jsonData.toString());
JSONArray jsonarr=新的JSONArray(jsonData);
对于(int i=0;i=0;i--)
{   
HashMap HashMap=新的HashMap();
put(HandleJSON.Key_用户名,jsonarr.getJSONObject(i.getString(“用户名”));
put(HandleJSON.Key_messageText,jsonarr.getJSONObject(i.getString(“chatText”));
put(HandleJSON.Key_messageDate,jsonarr.getJSONObject(i.getString)(“chatDate”);
Log.i(“dateeeee”,jsonarr.getJSONObject(i.getString(“chatDate”));
添加(hashMap);
}
回话;
}
捕获(JSONException e)
{
返回null;
}
}
公共静态ArrayList ReturnUsersMail(字符串jsonData)抛出JSONException
{
JSONArray jsonarr=新的JSONArray(jsonData);
ArrayList电子邮件=新建ArrayList();

对于(int i=0;i这需要一个调试器。要么
doInBackground
没有被调用(这不太可能),要么你的
parsejsonforuseradmincats
返回null。我打赌是后者。

一个简单的异常修复方法是将行更改为:

 if (null != data  &&  !data.isEmpty())  

我认为
data
的原因是
null
(而不是空的),这是因为
HandleJSON.ParseJsonForUserAdminChats()
正在返回
null
(请注意,在此之前立即执行的
new
是不需要的,也没有帮助的,顺便说一句)。

好吧,我确信这不是您真正的代码。 无论如何,如果你能运行它并得到这个异常,你不能用try-catch来处理它吗? 也许您的方法“HandleJSON.ParseJsonForUserAdminChats”正在为对象设置为null,并且isEmpty仅在列表没有元素时处理,如果变量为null则不处理

try {
  if(!data.isEmpty()) {
     //if data is not null and not empty will pass here
  }
} catch(NullPointerException e) {
  //If data == null it will pass here
}

您没有正确使用
AsyncTask
。 如果阅读中名为AsyncTask的泛型类型的部分,您将了解如何使用泛型类型在
doInBackground
onPostExecute
之间传递数据。 以下是您需要做的:

public class GetPreviousChatNewThread extends AsyncTask<Void,Void,List<HashMap<String, String>>> {

        ProgressDialog dialog;

        @Override
        protected  List<HashMap<String, String>> doInBackground(Void... void) {
            return HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
                    "ReturnUserAdminChats",
                    "admin",
                    "You" ,
                    "a",
                    clientEmail,
                    UserAdminChatActivity.LastShowingChatDate));
        }

        @Override
         protected void onPostExecute(List<HashMap<String, String>> result) {
            super.onPostExecute(result);
            if(null != result && !result.isEmpty()) { //checks not null or empty
                adapter.InsertValuesAtTop(result);
            }
            else
            {
                Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
            }
            if(dialog.isShowing())
             dialog.dismiss();

         }

        @Override
         protected void onPreExecute() {
             dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
         }

    }
公共类GetPreviousChatNewThread扩展异步任务{
进程对话;
@凌驾
受保护列表背景(无效…无效){
返回HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
“ReturnUserAdminChats”,
“管理员”,
“你”,
“a”,
客户邮件,
UserAdminChatActivity.LastShowingChatDate));
}
@凌驾
受保护的void onPostExecute(列表结果){
super.onPostExecute(结果);
if(null!=result&&!result.isEmpty()){//检查不为null或空
adapter.InsertValuesAtTop(结果);
}
其他的
{
Toast.makeText(getApplicationContext(),“无更多数据”,Toast.LENGTH_LONG.show();
}
if(dialog.isShowing())
dialog.dismise();
}
@凌驾
受保护的void onPreExecute(){
dialog=ProgressDialog.show(UserAdminChatActivity.this,“,”正在加载。请稍候…,true);
}
}
如果您得到了一个
Toast
,那么您就知道
HandleJSON.parsejsonforuseradmincats(…)
返回的数据是
null
或者如果(!data.isEmpty())返回一个空的
列表


这与数据无关!这与结果有关。所有返回数据都存储在结果中。

是的,它返回哈希映射的arraylist,但因为那里没有数据,所以返回null@Mj1992它在同一行上给出了一个空指针异常?如果数据真的是
null
,那就不应该是这样了。我不知所措。@Mj1992哦,我想你应该再尝试一件事(尽管我认为这没有关系):去掉
returnnull;
行自
doInBackground()
@Turix在他的代码中,他无法删除
return null;
,因为他会得到一个编译错误。这是因为他没有按预期使用
AsyncTask
。(请参阅我的帖子。)@Salil_Pandit是的,看到了,你的代码肯定比他的好。但我仍然不明白,对
数据的null检查至少没有避免异常。是的,它返回null,正如我在问题中提到的,现在我只想向用户显示没有数据,那么我如何处理列表ca的nulln请解释一下?你可以像Turix saied那样检查,或者像我将在mu post中发布的编辑一样处理它。嘿,thnx用于回复。我尝试了代码,但它仍然给出相同的错误。我严重怀疑。如果(null!=result&&!result.isEmpty()),你不可能在
处收到NPE
。最有可能的情况是,您在
HandleJSON.parsejsonforuseradmincats
中获得了一个NPE。您可以发布该代码吗?也许我们可以帮助您找到问题所在。@Mj1992您可以使用我的代码发布日志吗?包括
HandleJSON
类中的日志吗?也可以
public class GetPreviousChatNewThread extends AsyncTask<Void,Void,List<HashMap<String, String>>> {

        ProgressDialog dialog;

        @Override
        protected  List<HashMap<String, String>> doInBackground(Void... void) {
            return HandleJSON.ParseJsonForUserAdminChats(sendHttpRequest(
                    "ReturnUserAdminChats",
                    "admin",
                    "You" ,
                    "a",
                    clientEmail,
                    UserAdminChatActivity.LastShowingChatDate));
        }

        @Override
         protected void onPostExecute(List<HashMap<String, String>> result) {
            super.onPostExecute(result);
            if(null != result && !result.isEmpty()) { //checks not null or empty
                adapter.InsertValuesAtTop(result);
            }
            else
            {
                Toast.makeText(getApplicationContext(), "No more data", Toast.LENGTH_LONG).show();
            }
            if(dialog.isShowing())
             dialog.dismiss();

         }

        @Override
         protected void onPreExecute() {
             dialog = ProgressDialog.show(UserAdminChatActivity.this, "", "Loading. Please wait...", true);
         }

    }