2017-06-14 60 views
-1

我一直有一個錯誤,其中來自firebase的用戶標識顯然是空對象,即使我做了一個if語句來檢查它是不是。 錯誤:Firebase UserID空指針異常當通過空檢查

FATAL EXCEPTION: main 
    Process: com.example.matthew.myapplication, PID: 18396 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.matthew.myapplication/com.example.matthew.myapplication.cb}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DataSnapshot com.google.firebase.database.DataSnapshot.child(java.lang.String)' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
     at android.app.ActivityThread.access$1100(ActivityThread.java:223) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:7223) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DataSnapshot com.google.firebase.database.DataSnapshot.child(java.lang.String)' on a null object reference 
     at com.example.matthew.myapplication.cb.getGameList(cb.java:112) 
     at com.example.matthew.myapplication.cb.onCreate(cb.java:69) 
     at android.app.Activity.performCreate(Activity.java:6877) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)  
     at android.app.ActivityThread.access$1100(ActivityThread.java:223)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:7223)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我不知道如何當它不應該是錯誤的發生。代碼處理這種情況的代碼片段:

public void getGameList(){ 
    Boolean isDone = false; 
    int che = 0; 
    if(uID != null) { 
     while (isDone == false) { 
      String sche = Integer.toString(che); //error is on this line at uID 
      if (datas.child(uID).child("Game List").hasChild(sche)) { 
       list.add(datas.child(datas.child(uID).child("Game List").child(sche).getValue().toString()).child("GAME NAME").getValue().toString()); 
       list.add(datas.child(datas.child(uID).child("Game List").child(sche).getValue().toString()).child("GAMEID").getValue().toString()); 
       che = che + 1; 
      } else { 
       isDone = true; 
      } 

     } 
    } 

} 

user = FirebaseAuth.getInstance().getCurrentUser(); 
    uID = user.getUid(); 

    cont = (Button) findViewById(R.id.con); 
    back = (Button) findViewById(R.id.ret); 
    game = (Spinner) findViewById(R.id.games); 

    list.add("Select a Game"); 
    list2.add("novalue"); 
    myRef = FirebaseDatabase.getInstance().getReference(); 

    ValueEventListener postListener = new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      datas = dataSnapshot; 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 

我也都沒有這個問題,因爲我用在其他幾類這個確切的片斷這之前是奇怪,但它只是在這些地方出現問題。 任何幫助的讚賞,即使這是一個問題,我錯過了當搜索這個問題的答案。謝謝你,有一個美好的一天。

回答

0

您正在獲取null,因爲您在onDataChange()方法之外使用的是datas。發生這種情況是因爲onDataChange以異步方式調用。這意味着您在該方法之外執行的所有操作都會在調用該方法之前執行。要解決這個問題,請將這些語句移到onDataChange()方法中,並且每個方法都可以正常工作。

希望它有幫助。

+0

我在其他部分有這種方式,它工作正常。 'onDataChange()'在'onCreate'中的所有內容之前被調用這個問題發生的唯一時間是該部分,它很麻煩。我會盡力而爲。 – Matt

+0

在onDataChange方法實際分配它之前,變量'datas'將爲空。你需要那個價值在哪裏?在'DatabaseReference'中?只需在'onDataChange()'中直接使用它。 需要更復雜的東西,從'onDataChange()'調用一個單獨的方法並傳遞參數。如果你想要更復雜的東西,請嘗試同步代碼。 –

+0

我需要在按鈕點擊事件中調用'datas'。但爲了防止這種情況,我正在使用if語句在繼續之前檢查它是否爲空。 – Matt