java - 异步任务中的json空指针错误

标签 java php android mysql json

我有一个忘记密码 Activity ,它连接到 mysql 数据库并生成新密码。然而; json 对象总是返回空指针异常。 php 脚本有一个用于测试的 html 表单,并且它运行完美,因此错误肯定存在于 java 代码中。

这是 Json Parser 类:

package test.example.com.test;
import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }
    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
                                      List<NameValuePair> params) {
        // Making HTTP request
        try {
            // check for request method
            if(method == "POST"){
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }else if(method == "GET"){
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
        // return JSON String
        return jObj;
    }
}

这是异步任务:

class ForgetPass extends AsyncTask<String, String, String> {

    boolean failure = false;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(forg1.this);
        pDialog.setTitle("Generating New Password...");
        pDialog.setCancelable(true);
        pDialog.setIndeterminate(false);
        pDialog.show();

    }

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
        // Check for success tag
        int success;
        String Email;

        Email = etMailfrpass.getText().toString();

        try {

            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("Email", Email));
            JSONObject json5 = js.makeHttpRequest(
                    FORGET_URL, "POST", params);

           // Log.d("Ibrahim forget pass", "Ibrahim forget pass");
            success = json5.getInt(TAG_SUCCESS);

            if (success == 1) {
                //Log.d("Password generated", json5.toString());
                pDialog.dismiss();

                return json5.getString(TAG_MESSAGE);
            } else {
              //  Log.d("generation Failure!", json5.getString(TAG_MESSAGE));
                return json5.getString(TAG_MESSAGE);

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

        return null;
    }

    protected void onPostExecute(String file_url1) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();
        if (file_url1 != null) {
            Toast.makeText(forg1.this, file_url1, Toast.LENGTH_LONG).show();
        }
    }
}

这是日志,错误位于 json.getInt

05-08 11:12:28.336  16229-16554/test.example.com.test E/JSON Parser﹕ Error parsing data org.json.JSONException: Value fetet of type java.lang.String cannot be converted to JSONObject
05-08 11:12:28.336  16229-16554/test.example.com.test W/dalvikvm﹕ threadid=11: thread exiting with uncaught exception (group=0x40aa5228)
05-08 11:12:28.346  16229-16554/test.example.com.test E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:278)
            at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:864)
     Caused by: java.lang.NullPointerException
            at test.example.com.test.forg1$ForgetPass.doInBackground(forg1.java:107)
            at test.example.com.test.forg1$ForgetPass.doInBackground(forg1.java:73)
            at android.os.AsyncTask$2.call(AsyncTask.java:264)
            at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
            at java.util.concurrent.FutureTask.run(FutureTask.java:137)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:864)

最佳答案

假设出现问题,因此这部分在 jObj 中返回 null:

// try parse the string to a JSON object
try {
    jObj = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;

现在您的AsyncTask尝试在返回的jObj中调用getString()方法,该方法本身为空(每当成功为1时或不):

    if (success == 1) {
        //Log.d("Password generated", json5.toString());
        pDialog.dismiss();

        return json5.getString(TAG_MESSAGE);
    } else {
      //  Log.d("generation Failure!", json5.getString(TAG_MESSAGE));
        return json5.getString(TAG_MESSAGE);

    }

现在您就可以使用 NPE 了。

关于java - 异步任务中的json空指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30119147/

相关文章:

php - 将数据库中的所有记录迭代到一个表中

android - 模拟器只收到 GCM 消息?

java - 无法让 String.split() 在 android 上按预期工作

java - 为什么我的代码对非静态进行静态引用?怎么修?

java - 如何在 Android 中的联系人数据库上设置触发器

php - 在 cakephp 2.1 中找不到类 'CakeLog' 错误

PHP + MySQL事务+语法错误

android - TelephonyMagager.getDeviceId 在 Galaxy S3 上的 BootTime 期间失败

java - 没有找到适合jdbc.sqlite的驱动,比较复杂

java - ScrollView 不会在 ViewPager 中滚动