Firebase UserID空指针异常通过空检查

时间:2017-06-14 18:30:50

标签: android firebase firebase-realtime-database

我一直有一个错误,即来自firebase的用户id显然是一个空对象,即使我做了一个if语句来检查它是不是。 错误:

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) {

        }
    };

我之前还没有这个问题很奇怪,因为我在其他几个类中使用了这个确切的片段,但它只是出现问题的地方。 任何帮助都表示赞赏,即使是在搜索此问题的答案时我错过了一个问题。谢谢你,祝你有个美好的一天。

2 个答案:

答案 0 :(得分:0)

您收到null,因为您在datas方法之外使用onDataChange()。发生这种情况是因为onDataChange是以异步方式调用的。这意味着您在该方法之外执行的所有操作都是在调用onDataChange()方法之前执行的。要解决此问题,请在onDataChange()方法中移动这些语句,并且everythig将正常工作。

希望它有所帮助。

答案 1 :(得分:0)

{
   private FirebaseAuth mAuth;
   ...

   mAuth = FirebaseAuth.getInstance();

   if(mAuth.getCurrentUser() != null){
      uID = mAuth.getCurrentUser().getUid();
   }

   ...
}

我认为这可以解决您的问题