Java 方法未执行log.d语句

Java 方法未执行log.d语句,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,第1部分-我有一个方法readData(),它接受接口FirebaseCallBack的参数。 我正在调用getAdminInfo()方法中的readData(),而Log.d语句(第8行)没有得到执行。我的应用程序因空指针异常而崩溃 第2部分-也是firebaseCallback.Callback(NewVoluntal)抛出错误“局部变量是从内部类中访问的;需要声明为final”。但在stack overflow用户@Alex_mamo的视频中,没有显示任何错误。只是直觉告诉我做错了什么 p

第1部分-我有一个方法readData(),它接受接口FirebaseCallBack的参数。 我正在调用getAdminInfo()方法中的readData(),而Log.d语句(第8行)没有得到执行。我的应用程序因空指针异常而崩溃

第2部分-也是firebaseCallback.Callback(NewVoluntal)抛出错误“局部变量是从内部类中访问的;需要声明为final”。但在stack overflow用户@Alex_mamo的视频中,没有显示任何错误。只是直觉告诉我做错了什么

public String getAdminInfo(){
    dbRef = FirebaseDatabase.getInstance().getReference("Volunteer");
    uid= mAuth.getCurrentUser().getUid();

    readData(new FirebaseCallBack() {
        @Override
        public void Callback(Volunteer data) {
            Log.d("crashfix" ," I am not executing ");
            adminStatus = data.isAdmin();
        }
    });
    return adminStatus;
}

//Read data from firebase
private void readData(FirebaseCallBack firebaseCallBack){
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            newVolunteer.setFullName((String) dataSnapshot.child("fullName").getValue());
            newVolunteer.setAdmin((String) dataSnapshot.child("admin").getValue());
            newVolunteer.setEmail((String) dataSnapshot.child("email").getValue());
            newVolunteer.setGender((String) dataSnapshot.child("gender").getValue());
            Log.d("crashfix" ," name fetch: " + newVolunteer.getFullName());
            firebaseCallBack.Callback(newVolunteer);
        }


        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

    dbRef.child(uid).addListenerForSingleValueEvent(valueEventListener);
}

//Wait till the data is downloaded from firebase
private interface FirebaseCallBack{
    void Callback(Volunteer data);
}
在这一行,我得到了空指针异常:-

String admin = getAdminInfo();
    Log.d("crashfix" ,"inside onCreate admin" + admin);
    //checking if current user is admin
    if(admin.equals("true")){
            Toast.makeText(this,"Welcome! " + newVolunteer.getFullName() , Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, Main2Activity.class);
            startActivity(intent);
            finish();
    }
事故日志:-

2020-03-30 13:41:53.060 13021-13021/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.helpinghandsorg.helpinghands, PID: 13021
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.helpinghandsorg.helpinghands/com.helpinghandsorg.helpinghands.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3123)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3266)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1957)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7099)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
    at com.helpinghandsorg.helpinghands.MainActivity.onCreate(MainActivity.java:57)
    at android.app.Activity.performCreate(Activity.java:7327)
    at android.app.Activity.performCreate(Activity.java:7318)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1275)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3103)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3266) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1957) 
    at android.os.Handler.dispatchMessage(Handler.java:106) 
    at android.os.Looper.loop(Looper.java:214) 
    at android.app.ActivityThread.main(ActivityThread.java:7099) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 

空指针异常错误是不言自明的

java.lang.RuntimeException:无法启动activity ComponentInfo{com.helpinghandsorg.helpinghands/com.helpinghandsorg.helpinghands.MainActivity}:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”

虽然您尚未显示发生这种情况的代码,似乎您正在尝试对字符串的null引用调用
equals
方法。
我将确保检查该变量是否确实不是null

这就是您没有看到日志的原因,因为您的应用程序正在崩溃

对于第二个问题,当在
onDataChange
方法中时,您无法访问局部变量,因此您看到了该错误

考虑在方法内部创建一个变量,并通过回调将其传递到其他变量所在的位置

更新(根据OP的评论)

要接收管理员信息的更新值,可以执行以下操作:

public String getAdminInfo(successCallback, failureCallback){
   dbRef = FirebaseDatabase.getInstance().getReference("Volunteer");
   uid= mAuth.getCurrentUser().getUid();

   readData(new FirebaseCallBack() {
    @Override
      public void Callback(Volunteer data) {
        Log.d("crashfix" ," I am not executing ");
        adminStatus = data.isAdmin();
        //Here is where you insert your callback
        successCallback(adminStatus);
      }
   });
   return adminStatus;
 }

在代码中的某个地方:

getAdminInfo(gotAdminInfoSuccess, gotAdminInfoFailure);


private void gotAdminInfoSuccess(String adminState) {
     Log.d("crashfix" ,"inside onCreate admin" + admin);
    //checking if current user is admin
    if(adminState.equals("true")){
            Toast.makeText(this,"Welcome! " + newVolunteer.getFullName() , Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(this, Main2Activity.class);
            startActivity(intent);
            finish();
    }

}

 private void gotAdminInfoFailure(String error) {
    //Do your failure logic here

 } 

代码中的问题在于,您仍在尝试从异步操作返回结果,这是不可能的。
getAdminInfo()
无法以同步方式返回该结果。基本上,您尝试从异步API同步返回一个值。那不是个好主意。您应该按照预期异步处理API


话虽如此,您唯一的选择是在
readData()
onDataChange()
方法中使用
adminStatus
statusonly

我用导致空指针异常的行更新了问题。getAdminInfo()不应返回null,它正在从firebase获取非null的数据。对于第2部分-创建回调实例的整个要点是获取onDataChange之外的数据。考虑看我提供的视频,它会让你明白。@ ViaykHayayTa-GATADMIN是一个异步任务,因此,你不是在等待结果,这就是为什么你有一个空指针异常…@ ViaykHalaya-我更新了我的答案。既然它对你有帮助,请把它标记为这样。这是我到现在为止写的这是我到现在为止做的,你能看一下吗。您应该将
data.isAdmin()
保存到变量中,并将其进一步用于逻辑,但只能在
readData()
方法中使用。代码的其他部分在我看来很好。