方法没有执行log.d语句



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

第2部分-也是firebaseCallback.Callback(newVolunteer(抛出错误"本地变量是从内部类中访问的;需要声明为final">。但在这个堆栈溢出用户@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:无法启动活动ComponentInfo{com.helpinghands.helpinghands.com.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状态

最新更新