Java 通过firebase google signin检索用户名和电子邮件时调用onResume()时出现空对象引用异常

Java 通过firebase google signin检索用户名和电子邮件时调用onResume()时出现空对象引用异常,java,android,Java,Android,我正在制作一个android应用程序。我试图在java的文本视图中设置用户的用户名和邮件。当我第一次启动应用程序时,会设置数据,就像我使用google signin登录一样,但当我退出应用程序并尝试再次启动时,它会崩溃,从而产生空对象引用异常。 它不会第二次从以下位置拾取值: mUsername = user.getDisplayName(); 我只有以下MainActivity类: public class MainActivity extends AppCompatActivity

我正在制作一个android应用程序。我试图在java的文本视图中设置用户的用户名和邮件。当我第一次启动应用程序时,会设置数据,就像我使用google signin登录一样,但当我退出应用程序并尝试再次启动时,它会崩溃,从而产生空对象引用异常。 它不会第二次从以下位置拾取值:

mUsername = user.getDisplayName();
我只有以下MainActivity类:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

public static final String ANONYMOUS = "anonymous";
public static final String EMAIL = "mail@domain.com";
public static final int RC_SIGN_IN = 1;

private String mUsername;
private String mEmail;

private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mDatabaseReference;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;


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


    /**Add Drawer layout and Navigation view*/
    addDrawerLayoutAndNAvigationView();

    /**FireBase Authentication Check*/
    runFirebaseAuthenticator();

}

private void setUsernameAndMail(String name, String mail) {
    TextView username = (TextView) findViewById(R.id.username_text_view);
    username.setText(name);

    TextView email = (TextView) findViewById(R.id.user_mail_text_view);
    email.setText(mail);
}

@Override
protected void onResume() {
    super.onResume();
    if(mFirebaseAuth!=null){
        FirebaseUser user = mFirebaseAuth.getCurrentUser();
        onSignedInInitializer(user.getDisplayName(), user.getEmail());
    }
    mFirebaseAuth.addAuthStateListener(mAuthStateListener);
}

@Override
protected void onPause() {
    super.onPause();
    if (mAuthStateListener != null) {
        mFirebaseAuth.removeAuthStateListener(mAuthStateListener);
    }
}


@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}


@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();
    if (id == R.id.home) {
        Intent i = new Intent(this, MainActivity.class);
        startActivity(i);
    } else if (id == R.id.settings) {
        Intent i = new Intent(this, SettingsActivity.class);
        startActivity(i);
    } else if (id == R.id.signout) {
        AuthUI.getInstance().signOut(this);
        return true;
    }
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}


private void addDrawerLayoutAndNAvigationView() {

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}


private void runFirebaseAuthenticator() {

    mUsername = ANONYMOUS;
    mEmail = EMAIL;
    mFirebaseDatabase = FirebaseDatabase.getInstance();

    mFirebaseAuth = FirebaseAuth.getInstance();

    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {

                Toast.makeText(MainActivity.this, "You are signed in!", Toast.LENGTH_LONG).show();
                onSignedInInitializer(user.getDisplayName(), user.getEmail());
            } else {

                onSignedOutCleanup();
                startActivityForResult(
                        AuthUI.getInstance()
                                .createSignInIntentBuilder()
                                .setIsSmartLockEnabled(false)
                                .setAvailableProviders(Arrays.asList(
                                        new AuthUI.IdpConfig.GoogleBuilder().build(),
                                        new AuthUI.IdpConfig.EmailBuilder().build()))
                                .build(),
                        RC_SIGN_IN);
            }
        }
    };
}


public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_SIGN_IN) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(MainActivity.this, "Signed In!", Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(MainActivity.this, "Signed Cancelled!", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}


private void onSignedInInitializer(String username, String email) {
    mUsername = username;
    mEmail = email;
    /**Set username and email*/
    setUsernameAndMail(mUsername,mEmail);
}

private void onSignedOutCleanup() {
    mUsername = ANONYMOUS;
    mEmail = EMAIL;
}}
java.lang.RuntimeException: Unable to resume activity {example.com.navdrawer/example.com.navdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3519)
                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559)
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807)
                                                   at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548)
                                                   at android.os.Handler.dispatchMessage(Handler.java:102)
                                                   at android.os.Looper.loop(Looper.java:163)
                                                   at android.app.ActivityThread.main(ActivityThread.java:6372)
                                                   at java.lang.reflect.Method.invoke(Native Method)
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791)
                                                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                                                   at example.com.navdrawer.MainActivity.setUsernameAndMail(MainActivity.java:61)
                                                   at example.com.navdrawer.MainActivity.onSignedInInitializer(MainActivity.java:188)
                                                   at example.com.navdrawer.MainActivity.onResume(MainActivity.java:72)
                                                   at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
                                                   at android.app.Activity.performResume(Activity.java:6974)
                                                   at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3496)
                                                   at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3559) 
                                                   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2807) 
                                                   at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1548) 
                                                   at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                   at android.os.Looper.loop(Looper.java:163) 
                                                   at android.app.ActivityThread.main(ActivityThread.java:6372) 
                                                   at java.lang.reflect.Method.invoke(Native Method) 
                                                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:791) 
然后是nav_header_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_header_height"
android:background="@drawable/side_nav_bar"
android:gravity="bottom"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:theme="@style/ThemeOverlay.AppCompat.Dark">

<ImageView
    android:id="@+id/imageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    app:srcCompat="@mipmap/ic_launcher_round" />

<TextView
    android:id="@+id/username_text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:text="@string/username"
    android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

<TextView
    android:id="@+id/user_mail_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/user_mail" />
</LinearLayout>

我无法找到这个问题的解决方案。

@nilesh你能给我指出一个这样的解决方案吗,我找不到任何解决方案!按照以下回答@nilesh我想从firebase用户对象中获取用户名。我无法从用户obj将值放入我的“mUsername”变量中。不,问题出在您的
TextView用户名
TextView电子邮件
中,您需要像这样做
findViewById
@nilesh非常感谢!!!它解决了我面临的问题,但我仍然不明白为什么我必须将navigationView放入一个变量,然后查询其他变量。还有为什么显示空对象错误?