java Android - 迭代 List 时的空对象引用

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35757047/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 00:33:06  来源:igfitidea点击:

Android - null object reference when iterating List

javaandroidnullreferenceexception

提问by David Faizulaev

I'm trying to copy a List 'usrs' which is created in an Inner class to a different list 'team_memebers'. After copying I try to iterate 'team_memebers' in the FOR loop, but I get a 'null object reference' error. The 'users' list contains the returned objects, tested via debug prints.

我正在尝试将在内部类中创建的列表 'usrs' 复制到不同的列表 'team_memebers'。复制后,我尝试在 FOR 循环中迭代“team_memebers”,但出现“空对象引用”错误。“用户”列表包含返回的对象,通过调试打印进行测试。

public class ListNodeActivity extends AppCompatActivity
{
    private ParseObject parse_task=null;
    private List<String> team_memebers=null;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_node);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> usrs, ParseException e) {
            if (e == null) {

                team_memebers = new ArrayList<String>(usrs.size());
                for (ParseObject prso:usrs) {
                    team_memebers.add(new String(prso.getString("Username")));
                }
            } else {//handle the error
            }
        }
    });

    for (String str:team_memebers)
    {
        empolyeeSpinnerAdapter.add(str);
    }
}

Stack trace

堆栈跟踪

 FATAL EXCEPTION: main
 Process: il.ac.shenkar.david.todolistex2, PID: 14490
 java.lang.RuntimeException: Unable to start activity ComponentInfo{il.ac.shenkar.david.todolistex2/il.ac.shenkar.david.todolistex2.ListNodeActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
     at android.app.ActivityThread.-wrap11(ActivityThread.java)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:5417)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
  Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference
     at il.ac.shenkar.david.todolistex2.ListNodeActivity.onCreate(ListNodeActivity.java:116)
     at android.app.Activity.performCreate(Activity.java:6251)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)?
     at android.app.ActivityThread.-wrap11(ActivityThread.java)?
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)?
     at android.os.Handler.dispatchMessage(Handler.java:102)?
     at android.os.Looper.loop(Looper.java:148)?
     at android.app.ActivityThread.main(ActivityThread.java:5417)?
     at java.lang.reflect.Method.invoke(Native Method)?
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)?
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)?

采纳答案by Mirza Brunjadze

Your problem is that you aren't iterating after copying list. query.findInBackground()is an async callback and therefore, isn't executed immediately. Because your iteration loop is PLACEDbelow that callback, doesn't mean it will be executed after callback executes. Just put your loop inside callback like this:

您的问题是您在复制列表后没有进行迭代。 query.findInBackground()是一个异步回调,因此不会立即执行。因为你的迭代循环被放置后该回调的下方,但这并不意味着它会回调执行后执行。只需将您的循环放入回调中,如下所示:

query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> usrs, ParseException e) {
            if (e == null) {

            team_memebers = new ArrayList<String>(usrs.size());
            for (ParseObject prso:usrs) {
                team_memebers.add(new String(prso.getString("Username")));
            }
            for (String str:team_memebers)
            {
                empolyeeSpinnerAdapter.add(str);
            }
        } else {//handle the error
        }
    }
});