【问题标题】:NullPointer after execution onPostExecute method执行 onPostExecute 方法后的 NullPointer
【发布时间】:2014-04-25 09:54:26
【问题描述】:

我在检索 JSON 时遇到问题。我的 JSON 如下所示:

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

应用程序在 onPostExecute 中引发 NullPointerException,即使正确检索了 JSON。这是怎么回事?我完全被卡住了。

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();

【问题讨论】:

  • 你能显示堆栈跟踪吗?
  • 您的后台方法是字符串类型,您返回的是 null。这就是为什么您得到 null。将其更改为在后台方法中返回 wynik_klienci。
  • @DavidWallace 看看它
  • @Pankaj 我已经改了,没有进展

标签: android json android-asynctask gson


【解决方案1】:

你正在返回 null,你应该 return wynik_klienci

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

因为你隐藏了类成员wynik_klienci的作用域,所以调用onPostExecute的形参也是一样的

【讨论】:

  • Sir @blackelt 仍然存在错误,即使在您建议进行更改之后
  • 不,这是不可能的。再次运行并仔细检查错误
【解决方案2】:

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

【讨论】:

  • Walance,但不能为空。它应该写json格式。我只是想看看那个 json 被正确下载了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多