执行onPostExecute方法后的空指针

时间:2014-03-19 09:16:47

标签: android json android-asynctask gson

我在检索JSON时遇到问题。我的JSON看起来像这样:

[{"Kli_nazwa":"miechy ","Kli_adres":"miechowity ","Kli_nip":"12"},{"Kli_nazwa":"mi? ","Kli_adres":"szp 39","Kli_nip":"19"}]

即使正确检索到thr JSON,应用程序也会在onPostExecute中抛出NullPointerException。它发生了什么?我完全陷入困境。

private class PHPConnection_Klient extends AsyncTask<String, String, String> {

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

        wynik_klienci = getResponseKli();

        return wynik_klienci;
    }

    @Override
    protected void onPostExecute(String wynik_klienci) {
        // TODO Auto-generated method stub
        super.onPostExecute(wynik_klienci);
        System.out.println(wynik_klienci);

        Gson g1 = new Gson();

        List<Klient> klient = Arrays.asList(g1.fromJson(wynik_klienci,
                Klient[].class));

        try {
            klientDao.delete(klientDao.queryForAll());

            if (klient != null) {
                for (Klient k : klient) {
                    klientDao.create(k);
                }
            }

        } catch (final SQLException e) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    e.printStackTrace();
                }
            });
        }
    }

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

private String getResponseKli() {
    HttpClient client = new DefaultHttpClient();

    HttpGet request1 = new HttpGet(
            "myURL");

    try {
        HttpResponse response1 = client.execute(request1);

        String w1 = EntityUtils.toString(response1.getEntity());

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

    return "";
}

错误:

03-19 10:29:06.395: W/dalvikvm(5851): threadid=1: thread exiting with uncaught  exception (group=0x40be01f8)
03-19 10:29:06.403: E/AndroidRuntime(5851): FATAL EXCEPTION: main
03-19 10:29:06.403: E/AndroidRuntime(5851): java.lang.NullPointerException
03-19 10:29:06.403: E/AndroidRuntime(5851):     at  com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at com.example.inzynierka.MainActivity$PHPConnection_Klient.onPostExecute(MainActivity.java:627)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at com.example.inzynierka.MainActivity$PHPConnection_Klient.onPostExecute(MainActivity.java:1)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.os.AsyncTask.finish(AsyncTask.java:602)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.os.AsyncTask.access$600(AsyncTask.java:156)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.os.Looper.loop(Looper.java:137)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at android.app.ActivityThread.main(ActivityThread.java:4514)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at java.lang.reflect.Method.invokeNative(Native Method)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at java.lang.reflect.Method.invoke(Method.java:511)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
03-19 10:29:06.403: E/AndroidRuntime(5851):     at dalvik.system.NativeStart.main(Native Method)

这就是我正在执行两个PHPConnections:

PHPConnection_Klient php_kli = new PHPConnection_Klient();
        php_kli.execute();
        PHPConnection_Kategoria php_kt = new PHPConnection_Kategoria();

        php_kt.execute();

2 个答案:

答案 0 :(得分:2)

你要返回null,你应该return wynik_klienci

@Override
protected String doInBackground(String... params) {
    wynik_klienci = getResponseKli();
    return wynik_klienci;
}

因为你隐藏了类成员wynik_klienci的范围,所以以与它相同的方式调用onPostExecute的形式参数

答案 1 :(得分:0)

是的,在Android中,奇怪的是,System.out.println会抛出此异常,如果您将其传递给null,那就是这里发生了什么。所以我想你应该把一些逻辑放到onPostExecute中,这样如果传入一个null,它就会优雅地退出,或者做任何你需要它做的事情。