简体   繁体   English

由于将空值传递给FirebaseDatabase.getReference()而导致应用程序崩溃

[英]App crash because of passing a null value to FirebaseDatabase.getReference()

Hope you can help me with my error. 希望您能帮助我解决我的错误。 I am still working on my login-App, and till now the App runs fine despite some small errors. 我仍在开发我的登录应用程序,尽管有一些小错误,但到目前为止,该应用程序可以正常运行。 By now the user can sign in, login and change his profile information. 现在,用户可以登录,登录并更改其个人资料信息。 In the last steps, I also implemented a function to delete userinformation. 在最后的步骤中,我还实现了删除用户信息的功能。 Meanwhile, also the delete function works so that the userinformation gets deleted from FirebaseAuth and the FirebaseRealtimeDatabase. 同时,删除功能也起作用,以便从FirebaseAuth和FirebaseRealtimeDatabase中删除用户信息。 The problem occurs after deleting the userinformation; 删除用户信息后出现问题; The App crashes. 该应用程序崩溃。

Logcat: logcat的:

09-17 16:56:31.108 19975-19975/com.example.login E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.login, PID: 19975
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.login/com.example.login.ProfileActivity}: java.lang.NullPointerException: Can't pass null for argument 'pathString' in FirebaseDatabase.getReference()
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2464)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524)
    at android.app.ActivityThread.access$900(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:234)
    at android.app.ActivityThread.main(ActivityThread.java:5526)
    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: Can't pass null for argument 'pathString' in FirebaseDatabase.getReference()
    at com.google.firebase.database.FirebaseDatabase.getReference(com.google.firebase:firebase-database@@19.0.0:164)
    at com.example.login.ProfileActivity.onCreate(ProfileActivity.java:49)
    at android.app.Activity.performCreate(Activity.java:6285)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2524) 
    at android.app.ActivityThread.access$900(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1391) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:234) 
    at android.app.ActivityThread.main(ActivityThread.java:5526) 
    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) 

ProfileActivity: ProfileActivity:

public class ProfileActivity extends AppCompatActivity {

private TextView profilVorname,profilNachname,profilStrasse,profilHNr,profilPlz,profilStadt,profilLand;
private Button profilUpdate,PasswortUpdate;
private FirebaseAuth firebaseAuth;
private FirebaseDatabase firebaseDatabase;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    profilVorname= findViewById(R.id.textViewPVorname);
    profilNachname=findViewById(R.id.textViewPNachname);
    profilUpdate=findViewById(R.id.buttonProfilUpdate);
    profilStrasse=findViewById(R.id.textViewPStrasse);
    profilHNr=findViewById(R.id.textViewPHNr);
    profilPlz=findViewById(R.id.textViewPPlz);
    profilStadt=findViewById(R.id.textViewPStadt);
    profilLand=findViewById(R.id.textViewPLand);
    PasswortUpdate=findViewById(R.id.buttonPasswordUpdate);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    firebaseAuth=FirebaseAuth.getInstance();
    firebaseDatabase= FirebaseDatabase.getInstance();

    DatabaseReference databaseReference= firebaseDatabase.getReference(firebaseAuth.getUid());

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            UserProfil userProfil=dataSnapshot.getValue(UserProfil.class);
            profilVorname.setText(userProfil.getVorname());
            profilNachname.setText(userProfil.getNachname());
            profilStrasse.setText(userProfil.getStrasse());
            profilHNr.setText(userProfil.getHnr());
            profilPlz.setText(userProfil.getPlz());
            profilStadt.setText(userProfil.getStadt());
            profilLand.setText(userProfil.getLand());

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(ProfileActivity.this,"Database Error",Toast.LENGTH_SHORT).show();
        }
    });



    profilUpdate.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            startActivity(new Intent(ProfileActivity.this,UpdateProfilActivity.class));

        }
    });

    PasswortUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(ProfileActivity.this,UpdatePasswortActivity.class));
        }
    });
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ProfileActivity.this, NavActivity.class));
}

UpdateProfilActivity: UpdateProfilActivity:

public class UpdateProfilActivity extends AppCompatActivity {

private EditText newUserVorname, newUserNachname,newUserStrasse,newUserHnr,newUserPlz,newUserStadt,newUserLand;
private Button speichern;
private FirebaseAuth firebaseAuth;
private FirebaseDatabase firebaseDatabase;
private TextView loeschen;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_update_profil);

    newUserVorname=findViewById(R.id.editTextVornameUpdate);
    newUserNachname=findViewById(R.id.editTextNachnameUpdate);
    newUserStrasse=findViewById(R.id.editTextStrasse);
    newUserHnr=findViewById(R.id.editTextHNr);
    newUserPlz=findViewById(R.id.editTextPlz);
    newUserStadt=findViewById(R.id.editTextStadt);
    newUserLand=findViewById(R.id.editTextLand);
    speichern=findViewById(R.id.buttonSpeichern);
    loeschen=findViewById(R.id.textViewLoeschen);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    firebaseAuth= FirebaseAuth.getInstance();
    firebaseDatabase= FirebaseDatabase.getInstance();

    final DatabaseReference databaseReference= firebaseDatabase.getReference(firebaseAuth.getUid());

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            UserProfil userProfil=dataSnapshot.getValue(UserProfil.class);
            newUserVorname.setText(userProfil.getVorname());
            newUserNachname.setText(userProfil.getNachname());
            newUserStrasse.setText(userProfil.getStrasse());
            newUserHnr.setText(userProfil.getHnr());
            newUserPlz.setText(userProfil.getPlz());
            newUserStadt.setText(userProfil.getStadt());
            newUserLand.setText(userProfil.getLand());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(UpdateProfilActivity.this,"Database Error",Toast.LENGTH_SHORT).show();
        }
    });

    speichern.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view){
            String Vorname = newUserVorname.getText().toString();
            String Nachname = newUserNachname.getText().toString();
            String Strasse = newUserStrasse.getText().toString();
            String HNr = newUserHnr.getText().toString();
            String Plz = newUserPlz.getText().toString();
            String Stadt = newUserStadt.getText().toString();
            String Land = newUserLand.getText().toString();


            UserProfil userProfil=new UserProfil(Vorname,Nachname,Strasse,HNr,Plz,Stadt,Land);

            databaseReference.setValue(userProfil);

            finish();


        }
    });

    loeschen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser();

            String uid=firebaseAuth.getCurrentUser().getUid();
            DatabaseReference databaseReference =firebaseDatabase.getReference(uid);

            databaseReference.removeValue();

            user.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        firebaseAuth.signOut();
                        startActivity(new Intent(UpdateProfilActivity.this, MainActivity.class));
                        finish();
                    }

                }
            });
        }
    });
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

} }

The core of the error message is this: 错误消息的核心是这样的:

So it seems you're calling getReference(null) , which is not allowed. 因此,似乎您正在调用getReference(null) ,这是不允许的。

In the code you shared, there are two calls to getReference() : 在您共享的代码中,有两个getReference()调用:

DatabaseReference databaseReference= firebaseDatabase.getReference(firebaseAuth.getUid());

And: 和:

String uid=firebaseAuth.getCurrentUser().getUid();
DatabaseReference databaseReference =firebaseDatabase.getReference(uid);

In one of these cases, the value you're passing into getReference(...) is null . 在这些情况之一中,您要传递给getReference(...)值为null I can't really figure out which one that is from the information you provided, and I am in fact surprised that the first one compiles, since the FirebaseAuth class does not seem to have a getUid() method. 我无法真正从您提供的信息中找出哪一个,而事实上我很惊讶第一个被编译,因为FirebaseAuth似乎没有getUid()方法。

在com.example.login.ProfileActivity.onCreate(ProfileActivity.java:49)处,查看第49行的ProfileActivity并调试该值以查看其是否为空

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM