【问题标题】:'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference空对象引用上的“java.lang.String com.google.firebase.auth.FirebaseUser.getUid()”
【发布时间】:2018-04-27 16:25:18
【问题描述】:
    package com.example.sarin.guff;

    import android.content.Intent;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.support.design.widget.NavigationView;
    import android.support.design.widget.TabLayout;
    import android.support.v4.view.GravityCompat;
    import android.support.v4.view.ViewPager;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.ActionBarDrawerToggle;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.Toolbar;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.auth.FirebaseUser;
    import com.google.firebase.database.DataSnapshot;
    import com.google.firebase.database.DatabaseError;
    import com.google.firebase.database.DatabaseReference;
    import com.google.firebase.database.FirebaseDatabase;
    import com.google.firebase.database.ServerValue;
    import com.google.firebase.database.ValueEventListener;
    import com.google.firebase.storage.StorageReference;
    import com.squareup.picasso.Picasso;

    public class MainActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener {

        private FirebaseAuth mAuth = FirebaseAuth.getInstance();
        FirebaseUser currentUser = mAuth.getCurrentUser();

        private static final int GALLERY_PIC =  1;
        private DatabaseReference onlineDatabase;
        private static final int MAX_LENGTH = 100;
        private TextView displayName;
        private TextView phoneNumber;
        private ImageView profilePicture;
        private StorageReference mStorage;
        private Toolbar toolbar;
        private ViewPager mViewPager;
        private SectionsPagerAdapter mSectionPagerAdapter;
        private TabLayout mTabLayout;
        private DatabaseReference mDatabaseReference;
        private String uId;
        private FirebaseUser mFireBaseUser;

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

            DrawerLayout drawer = 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 = findViewById(R.id.nav_view);
            View headerView = navigationView.getHeaderView(0);
            navigationView.setNavigationItemSelectedListener(this);

            // Tabs
            mViewPager = findViewById(R.id.main_tabPager);
            mSectionPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
            mViewPager.setAdapter(mSectionPagerAdapter);

            mTabLayout = findViewById(R.id.main_tabs);
            mTabLayout.setupWithViewPager(mViewPager);
            mTabLayout.setSelectedTabIndicatorColor(Color.parseColor("#4f1a97"));
            mTabLayout.setSelectedTabIndicatorHeight((int) (5 * getResources().getDisplayMetrics().density));
            mTabLayout.setTabTextColors(Color.parseColor("#4f1a97"), Color.parseColor("#4f1a97"));

//profile
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            String uId = user.getUid();

            mDatabaseReference = FirebaseDatabase.getInstance().getReference().child("users").child(uId);
            mDatabaseReference.keepSynced(true);
            profilePicture = headerView.findViewById(R.id.nav_profilePic);
            phoneNumber = headerView.findViewById(R.id.nav_phoneNumber);
            displayName = headerView.findViewById(R.id.nav_userName);

            currentUser = FirebaseAuth.getInstance().getCurrentUser();
            onlineDatabase = FirebaseDatabase.getInstance().getReference().child("users").child(currentUser.getUid()).child("Online");
            onlineDatabase.keepSynced(true);

            mDatabaseReference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    String name = dataSnapshot.child("Name").getValue().toString();
                    String image = dataSnapshot.child("Image").getValue().toString();
                    final String thumbImage = dataSnapshot.child("Thumb_image").getValue().toString();
                    String v_id = dataSnapshot.child("Id").getValue().toString();

                    displayName.setText(name);
                    phoneNumber.setText(v_id);

                    if(!thumbImage.equals("default")) {
                        Picasso.with(MainActivity.this).load(thumbImage).placeholder(R.drawable.avatar_default).into(profilePicture);
                    }

                    profilePicture.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            Intent intent = new Intent(getApplication(), FullScreenImageView.class);
                            intent.setType(thumbImage);
                            startActivity(intent);
                        }
                    });
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

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

        private void sendToStart(){
            Intent startIntent = new Intent(MainActivity.this, StartActivity.class);
            startActivity(startIntent);
            finish();
        }

        public boolean onNavigationItemSelected(MenuItem item) {
            // Handle navigation view item clicks here.
            int id = item.getItemId();

            if(item.getItemId() == R.id.nav_profile){
                startActivity(new Intent(MainActivity.this, SettingsActivity.class));
            }
            else if(item.getItemId() == R.id.nav_changePassword){
                startActivity(new Intent(MainActivity.this, VerifyPhone .class));
            }
            else if(item.getItemId() == R.id.nav_delete){
                startActivity(new Intent(MainActivity.this, DeleteAccountActivity.class));
            }
            else if(item.getItemId() == R.id.nav_logout){

                if ((onlineDatabase != (null))){
                    onlineDatabase.setValue(ServerValue.TIMESTAMP);
                    FirebaseAuth.getInstance().signOut();
                    sendToStart();

                }else
                {
                    DatabaseReference onlineDatabase  = FirebaseDatabase.getInstance().getReference().child("users").child(currentUser.getUid()).child("Online");
                }
            }
            else if(item.getItemId() == R.id.nav_findFriends){
                startActivity(new Intent(MainActivity.this, AllUsersActivity.class));
            }

            DrawerLayout drawer = findViewById(R.id.drawer_layout);
            drawer.closeDrawer(GravityCompat.START);
            return true;
        }
    }

我在第 89 行收到错误。

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.sarin.guff, PID: 3092
              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sarin.guff/com.example.sarin.guff.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2793)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864)
                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567)
                  at android.os.Handler.dispatchMessage(Handler.java:105)
                  at android.os.Looper.loop(Looper.java:156)
                  at android.app.ActivityThread.main(ActivityThread.java:6577)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
                  at com.example.sarin.guff.MainActivity.onCreate(MainActivity.java:91)
                  at android.app.Activity.performCreate(Activity.java:6910)
                  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2746)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2864) 
                  at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1567) 
                  at android.os.Handler.dispatchMessage(Handler.java:105) 
                  at android.os.Looper.loop(Looper.java:156) 
                  at android.app.ActivityThread.main(ActivityThread.java:6577) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832) 

应用程序终止。

错误:

java.lang.RuntimeException:无法启动活动 组件信息{com.example.sarin.guff/com.example.sarin.guff.MainActivity}: java.lang.NullPointerException:尝试调用虚拟方法 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' 空对象引用

有人可以帮我解决这个错误吗?提前致谢!

【问题讨论】:

标签: android firebase


【解决方案1】:

希望对你有帮助,也可以关注这个链接https://firebase.google.com/docs/auth/android/start/

 public class MainActivity extends AppCompatActivity
            implements NavigationView.OnNavigationItemSelectedListener {

        //it intialization should be inside onCreate
        private FirebaseAuth mAuth ;
        FirebaseUser currentUser 

        private static final int GALLERY_PIC =  1;
        private DatabaseReference onlineDatabase;
        private static final int MAX_LENGTH = 100;
        private TextView displayName;
        private TextView phoneNumber;
        private ImageView profilePicture;
        private StorageReference mStorage;
        private Toolbar toolbar;
        private ViewPager mViewPager;
        private SectionsPagerAdapter mSectionPagerAdapter;
        private TabLayout mTabLayout;
        private DatabaseReference mDatabaseReference;
        private String uId;
        private FirebaseUser mFireBaseUser;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            mAuth = FirebaseAuth.getInstance();
            currentUser = mAuth.getCurrentUser();
           //rest of your code 
    }
    }

【讨论】:

    【解决方案2】:

    在调用 FirebaseUser.getUid()

    之前确保用户已登录

    【讨论】:

      【解决方案3】:

      早上好,我的项目中也有类似的错误。这个错误通常发生在用户未登录时。 我所做的是: 1)尝试了堆栈溢出的所有解决方案,但它对我不起作用! 2)然后我去了我的项目的AndroidManifest.xml文件

      注意:我的登录页面是.RegistrationActivity 我的主页是..ContactsActivity

      Originally it was:
      
          <?xml version="1.0" encoding="utf-8"?>
          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.example.facehub2">
          
              <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
          
              <application
                  android:allowBackup="true"
                  android:icon="@mipmap/ic_launcher"
                  android:label="@string/app_name"
                  android:roundIcon="@mipmap/ic_launcher_round"
                  android:supportsRtl="true"
                  android:theme="@style/Theme.app1">
                  <activity android:name=".RegistrationActivity"></activity>
                  <activity android:name=".ContactsActivity">
                      <intent-filter>
                          <action android:name="android.intent.action.MAIN" />
          
                          <category android:name="android.intent.category.LAUNCHER" />
                      </intent-filter>
                  </activity>
              </application>
          
          </manifest>
      

      所以我改成:

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.facehub2">
      
          <uses-permission android:name="android.permission.INTERNET" ></uses-permission>
      
          <application
              android:allowBackup="true"
              android:icon="@mipmap/ic_launcher"
              android:label="@string/app_name"
              android:roundIcon="@mipmap/ic_launcher_round"
              android:supportsRtl="true"
              android:theme="@style/Theme.app1">
              <activity android:name=".RegistrationActivity">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN" />
                      <category android:name="android.intent.category.LAUNCHER" />
                  </intent-filter>
              </activity>
              <activity android:name=".ContactsActivity">
              </activity>
          </application>
      
      </manifest>
      

      我遇到错误的原因是 android.intent.action.MAIN 被分配给主 Activity,即 .ContactsActivity 而不是 .RegistrationActivity

      即,每当我尝试启动应用程序时,它都会首先显示我的 mainactivity 文件,这就是我收到错误消息的原因:Caused by: java.lang.NullPointerException。所以提供给我的注册活动文件,我可以先登录,错误已解决。谢谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多