2016-03-02 64 views
3

我試圖將在內部類中創建的列表'usrs'複製到不同列表'team_memebers'。 複製後,我嘗試迭代FOR循環中的'team_memebers',但我得到'空對象引用'錯誤。 「用戶」列表包含通過調試打印測試的返回對象。Android - 迭代時的空對象引用列表

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

堆棧跟蹤

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)  
+0

你有沒有試過一個正常的循環計數器而不是foreach循環? 喜歡的東西''對(INT I = 0; I

+0

是query.findInBackground在另一個線程.. –

+0

@chalarangelo,是的,它在.size()上失敗,因爲它看起來team_members爲空。 –

回答

3

你的問題是,你是不是複製列表後,遍歷。 query.findInBackground()是一個異步回調,因此不會立即執行。因爲您的迭代循環在回調下方爲PLDED,並不意味着它將在回調執行後執行。只是把你的循環回調像這樣:

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 
     } 
    } 
}); 
+0

我試着把它放在'query.findInBackground()'調用塊中,但我得到一條消息 - 「在內部類中訪問變量輸入;需要聲明爲最終的」 –

+0

你在哪個變量中得到這個消息? 'str'或'team_memebers'? – thisdotvoid

+0

無論如何,我建議你不要將'null'分配給'team_memebers',而是將其聲明爲final,並用空列表初始化: 'private final List team_memebers = new ArrayList <>();' 並刪除此行: '最後一個字符串str:team_memebers' – thisdotvoid