在onPostExecute()中的ArrayList空指针异常

3

在ArrayList中遇到了NullPointerException。我使用下面的代码记录ArrayList的大小,但我总是得到NPE。

可能的原因是什么?

 Log.d("catArrayList:Size:New", ""+categoryArrayList.size());

这里有更多的代码:

    protected void onPostExecute(Boolean result) {
        dialog.cancel();                 

        Log.d("catArrayList:Size", ""+categoryArrayList.size());
        Log.d("typArrayList:Size", ""+typeArrayList.size());
        Log.d("serArrayList:Size", ""+serviceArrayList.size());

        Log.d("cArrayList:Size", ""+cArrayList.size());
        Log.d("tArrayList:Size", ""+tArrayList.size());
        Log.d("sArrayList:Size", ""+sArrayList.size());

        Category c = categoryArrayList.get(0);      
        typeArrayList = c.getTypeArrayList();
        Log.d("catArrayList:Size:New", ""+categoryArrayList.size());

        for(int i=0;i<typeArrayList.size();i++) {
            tArrayList.add(typeArrayList.get(i).getName());
        }

        spinner1.setAdapter(new ArrayAdapter<String>(CategoryActivity.this,
                 android.R.layout.simple_spinner_dropdown_item,
                 cArrayList));

        spinner2.setAdapter(new ArrayAdapter<String>(CategoryActivity.this,
                android.R.layout.simple_spinner_dropdown_item,
                tArrayList));

        spinner3.setAdapter(new ArrayAdapter<String>(CategoryActivity.this,
                android.R.layout.simple_spinner_dropdown_item,
                sArrayList));

     }

日志显示:

 09-12 11:05:54.585: D/catArrayList:Size(30919): 2
09-12 11:05:54.585: D/typArrayList:Size(30919): 2
09-12 11:05:54.585: D/serArrayList:Size(30919): 2
09-12 11:05:54.585: D/cArrayList:Size(30919): 2
09-12 11:05:54.590: D/tArrayList:Size(30919): 2
09-12 11:05:54.590: D/sArrayList:Size(30919): 2
09-12 11:05:54.590: D/AndroidRuntime(30919): Shutting down VM
09-12 11:05:54.590: W/dalvikvm(30919): threadid=1: thread exiting with uncaught exception (group=0x40f9f2a0)
09-12 11:05:54.590: E/AndroidRuntime(30919): FATAL EXCEPTION: main
09-12 11:05:54.590: E/AndroidRuntime(30919): java.lang.NullPointerException
09-12 11:05:54.590: E/AndroidRuntime(30919):    at com.example.modulewise.CategoryActivity$JSONAsyncTask.onPostExecute(CategoryActivity.java:178)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at com.example.modulewise.CategoryActivity$JSONAsyncTask.onPostExecute(CategoryActivity.java:1)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.os.AsyncTask.finish(AsyncTask.java:631)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.os.Looper.loop(Looper.java:137)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at android.app.ActivityThread.main(ActivityThread.java:4921)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at java.lang.reflect.Method.invokeNative(Native Method)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at java.lang.reflect.Method.invoke(Method.java:511)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1036)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:803)
09-12 11:05:54.590: E/AndroidRuntime(30919):    at dalvik.system.NativeStart.main(Native Method)

在哪一行出现了 NPE?是第 178 行吗? - ρяσѕρєя K
@ρяσѕρєяK 在这一行代码:Log.d("catArrayList:Size:New", ""+categoryArrayList.size()); 中。 - Oreo
2
因为 categoryArrayList 是空的。我们无法确定它的来源,所以也不知道原因。 - JB Nizet
categoryArrayList 是空的吗? - ρяσѕρєя K
看起来它不会在那个日志处崩溃。因为该日志打印的是大小为2 ** 09-12 11:05:54.585的列表长度:D/catArrayList:Size(30919):2**。 - Jolson Da Costa
显示剩余7条评论
1个回答

3
如果在这一行抛出了NPE:
    Log.d("catArrayList:Size:New", ""+categoryArrayList.size());

如果出现了抛出异常的情况,那么很可能是因为程序中的categoryArrayList在此处为null。请检查该变量是否被正确初始化。
我还强烈怀疑你运行的代码与你在问题中展示的不同。根据我的理解,在这一点上categoryArrayList是不可能为null的。如果它为null,则在两行前会抛出NPE异常:
    Category c = categoryArrayList.get(0);

实际上,如果应用程序是多线程的,并且另一个线程与运行此方法的线程并行更新categoryArrayList,则由于竞争条件,变量可能变为null。然而,我预计这种情况只会很少发生。 我猜,另一种可能性是c.getTypeArrayList()调用作为副作用更新了categoryArrayList。 第三种可能性是NPE在你说的那一行没有发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接