0

我正在处理我的网络服务,但遇到了一个奇怪的问题。我无法解决这个问题,因为我是 android 开发的新手。我在异步任务的 onPostExecute() 方法中收到空指针异常。当我将结果与字符串进行比较时,就会发生这种情况。

if (result.contains("Duplicate"))           or 
if (result.equals("Duplicate"))             or
if (result.equalsIgnoreCase("Duplicate"))   or

这三个都给出错误。我已经通过 System.out.println(result); 打印了结果的值。它显示为

为了让我的问题变得更奇怪,这种情况有时会发生,尤其是当我的老板测试它时。其他时候效果很好。设备和网络都保持不变。早些时候它只发生在模拟器上。我曾经重新启动 eclipse 并且问题曾经得到解决。

请帮帮我!

代码

private void startDownload() {

    new AddTask().execute(FILENAME);
}

public class AddTask extends AsyncTask<String, Integer, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        dialog = ProgressDialog.show(ContactDetails.this, "Loading",
                "Please Wait...");

    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);


            if (result.contains("Duplicate")) { //---- here error comes

                int ecolor = -16777216; // whatever color you want
                String estring = "Account with this email already exists!!";
                ForegroundColorSpan fgcspan = new ForegroundColorSpan(
                        ecolor);
                SpannableStringBuilder ssbuilder = new SpannableStringBuilder(
                        estring);
                ssbuilder.setSpan(fgcspan, 0, estring.length(), 0);
                et2.setError(ssbuilder);
                dialog.dismiss();

            } else {
                Toast.makeText(ContactDetails.this, "Account Created!",
                        Toast.LENGTH_LONG).show();
                dialog.dismiss();
                myDialog = new Dialog(ContactDetails.this);
                myDialog.setContentView(R.layout.email_alert);
                myDialog.setTitle("Confirmation");
                myDialog.setCancelable(true);

                // for OK
                Button ok = (Button) myDialog.findViewById(R.id.alertOk);
                ok.setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {

                        Intent intent = new Intent(ContactDetails.this,
                                Login.class);
                        startActivity(intent);
                    }
                });
                myDialog.show();
            }
        }

    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }

    @Override
    protected String doInBackground(String... params) {

        is = null;
            individual();


        return is;
    }


    public void individual() {

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost(
                "http://website.com/contact.php");
        try {
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
                    10);
            nameValuePairs.add(new BasicNameValuePair("Name", str1));
            nameValuePairs.add(new BasicNameValuePair("Email", str2));
            nameValuePairs.add(new BasicNameValuePair("Password", str3));
            nameValuePairs.add(new BasicNameValuePair("Address", str5));
            nameValuePairs.add(new BasicNameValuePair("Pin", str11));
            nameValuePairs.add(new BasicNameValuePair("City", spt1));
            nameValuePairs.add(new BasicNameValuePair("State", str12));
            nameValuePairs.add(new BasicNameValuePair("phone_visibility",
                    str_radio));
            nameValuePairs.add(new BasicNameValuePair("No", str7));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            // httpclient.execute(httppost);

            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = EntityUtils.toString(entity);

            JSONArray jArray = new JSONArray(is);

            for (int i = 0; i < jArray.length(); i++) {

                JSONObject jObject = jArray.getJSONObject(i);

            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

- -编辑 - -

结果得到空值的原因是什么?是网络问题吗?有没有办法可以确保我不会得到空结果?如果我得到 null,我的应用程序将无法正常运行

4

5 回答 5

2

检查您是否从结果中获取数据...

if(result!=null){
// here check  the things you need


}

它对我有用

于 2013-10-29T10:34:01.937 回答
1

在结果中添加 NPE 检查

@Override
protected void onPostExecute(String result)
{
    if(result == null)
    {
        // handle null result, debug or whatever
        return;
    }
    .... 
    //rest of your code
}

编辑 我相信这是你的问题

HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = EntityUtils.toString(entity);

响应可能会得到空值,因此response.getEntity();会引发异常,并且 is = EntityUtils.toString(entity);永远不会达到,因此它将具有空值,并且在您 doInBackground 中您返回is的是空值 :) 所以您需要处理该空值并接受有时您会接受的事实获取空值。干杯

于 2013-10-29T10:34:03.523 回答
1

检查是否存在result..null如果不是,则仅执行您的操作..如下所示..

if(result!=null){
if (result.contains("Duplicate"))           or 
if (result.equals("Duplicate"))             or
if (result.equalsIgnoreCase("Duplicate"))   or
}
于 2013-10-29T10:24:29.013 回答
1

您在individual(). 当其中一个发生时,您result可能仍然为空,但您不会知道这一点。

您应该:

  1. 更改异常捕获代码并存储发生异常的附加信息,并在onPostExecute.

  2. 只需接受它result可以为 null 并正确处理它onPostExecute(检查 null 并执行一些适当的操作)。

于 2013-10-29T10:24:42.310 回答
0
protected String doInBackground

返回字符串

您正在返回null

onPostExecute(String result) 

处理该String

您不能在null上调用“包含”

使固定:

    @Override

    protected String doInBackground(String... params) {

    is = individual();

    return is;
}

public String individual() {

...将您的 JSON 数据放入字符串中...

于 2014-03-17T21:34:18.477 回答