Исключение JavaNullPointerException после входа в систему

# #java #android #firebase #firebase-authentication

Вопрос:

Привет, итак, я разрабатываю свое первое приложение в Android studio, и у меня проблема с моей панелью управления после входа в систему, я продолжаю получать исключение Java nullpointerexception. Вчера мне каким-то образом удалось заставить его работать, но он сломался после того, как я попытался войти в систему с другим пользователем, отличным от того, которого я использовал, а также показывал имя пользователя старого пользователя, который вошел в систему.

Ошибка:

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.licentabuna, PID: 2405
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.licentabuna/com.example.licentabuna.MainFrame}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getEmail()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getEmail()' on a null object reference
        at com.example.licentabuna.MainFrame.onCreate(MainFrame.java:32)
        at android.app.Activity.performCreate(Activity.java:8000)
        at android.app.Activity.performCreate(Activity.java:7984)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3422)
 

Код интерфейса:

 package com.example.licentabuna;

import androidx.appcompat.app.AppCompatActivity;
import androidx.cardview.widget.CardView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainFrame extends AppCompatActivity  implements View.OnClickListener{
    private FirebaseAuth firebaseAuth;
    TextView firebasenameview;
    Button toast;

    private CardView addPacienti,searchPacienti,transfPacienti,checkPacienti;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_frame);
        firebasenameview = findViewById(R.id.firebase_nume); 

        firebaseAuth=FirebaseAuth.getInstance();

        final FirebaseUser user=firebaseAuth.getCurrentUser();
        String  finaluser=(user).getEmail();
        String result=finaluser.substring(0,finaluser.indexOf("@"));
        String resultemail=result.replace(".","");
        firebasenameview.setText(""   resultemail);
  /*      toast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainFrame.this,users.getEmail(),Toast.LENGTH_SHORT).show();
           }
        });*/

        
        addPacienti=(CardView)findViewById(R.id.add_pacient);
        searchPacienti=(CardView)findViewById(R.id.cautare_pacient);
        transfPacienti=(CardView)findViewById(R.id.transf_pacient);

        
        addPacienti.setOnClickListener(this);
        searchPacienti.setOnClickListener(this);
        transfPacienti.setOnClickListener(this);

    }

    @Override
    public void onClick(View view){
        Intent i;

        
        switch (view.getId()){
            case R.id.add_pacient:i=new Intent(this,addPacienti.class);
              startActivity(i);
              break;
            case R.id.cautare_pacient:i=new Intent(this,cautarePacienti.class);
             startActivity(i);
             break;
//            case R.id.transf_pacient:i=new Intent(this,transfPacientiActivity.class);
//              startActivity(i);
//              break;
            default:break;
            }

    }
}
 

Login code:

 package com.example.licentabuna;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResu<
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;


public class Login extends AppCompatActivity  {
    private EditText mID;
    private EditText mPassword;
    private Button mloginBtn;
    private FirebaseAuth fAuth;
    private ProgressBar progressBar;
    int counter=0;

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

        mID = (EditText) findViewById(R.id.ID);
        mPassword = (EditText) findViewById(R.id.Pw);
        mloginBtn = (Button) findViewById(R.id.loginBtn);
        mloginBtn.setOnClickListener(v -> {userLogin();});

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        fAuth=FirebaseAuth.getInstance();


        mloginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                    case R.id.loginBtn:
                        startActivity(new Intent(Login.this,MainFrame.class));
                        userLogin();
                }
            }
        });
    }


    private void userLogin() {
        String id = mID.getText().toString().trim();
        String pass = mPassword.getText().toString().trim();


        if (TextUtils.isEmpty(id)) {
            mID.setError("Adaugati emailul dvs");
            mID.requestFocus();
            return;
        }
        if (!Patterns.EMAIL_ADDRESS.matcher(id).matches()) {
            mID.setError("Adauga-ti o adresa valida de email");
            mID.requestFocus();
            return;
        }
        if (TextUtils.isEmpty(pass)) {
            mPassword.setError("Adaugati parola");
            mPassword.requestFocus();
            return;
        }

        if (pass.length() < 6) {
            mPassword.setError("Parola trebuia sa aiba 6 sau mai multe caractere");
            mPassword.requestFocus();
            return;
        }
        progressBar.setVisibility(View.VISIBLE);

        fAuth.signInWithEmailAndPassword(id,pass).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

                if(user.isEmailVerified()){
                    startActivity(new Intent(Login.this,MainFrame.class));
                }else{
                    user.sendEmailVerification();
                    Toast.makeText(Login.this,"Verifica-ti emailul pentru verificare",Toast.LENGTH_LONG).show();
                }

                if(task.isSuccessful()){
                    //redirect spre profil user
                    Toast.makeText(Login.this, "Login Successful", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(Login.this, MainFrame.class));

                }else{
                    Toast.makeText(Login.this,"Verifica-ti-va datele de autentificare",Toast.LENGTH_LONG).show();
                }
            }
        });
    }
};
 

XML:

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="wrap_content"
    android:background="@drawable/background1"
    tools:context=".MainFrame">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />


    <TextView
        android:id="@ id/firebase_nume"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_marginStart="137dp"
        android:layout_marginTop="20dp"
        android:layout_marginEnd="197dp"
        android:layout_marginBottom="21dp"
        android:fontFamily="@font/roboto"
        android:text="Salut,"
        android:textColor="#020202"
        android:textSize="25sp"
        android:textStyle="bold" />

    <GridLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/firebase_nume"
        android:rowCount="3"
        android:columnCount="2">

        <androidx.cardview.widget.CardView
            android:id="@ id/add_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:cardBackgroundColor="#39ECC8"
            android:layout_row="0"
            android:layout_rowWeight="1"
            android:layout_column="0"
            android:layout_columnWeight="1"
            android:layout_gravity="fill"
            android:layout_margin="8dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:gravity="center"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_stat_add" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Adaugare Pacient"
                    android:textAlignment="center"
                    android:textStyle="bold" />
            </LinearLayout>
        </androidx.cardview.widget.CardView>

        <androidx.cardview.widget.CardView
            android:id="@ id/cautare_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="0"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_margin="8dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center"
                android:layout_gravity="center_vertical|center_horizontal">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_stat_search" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Cautare Pacient"
                    android:textStyle="bold"
                    android:textAlignment="center"/>
            </LinearLayout>
        </androidx.cardview.widget.CardView>

        <androidx.cardview.widget.CardView
            android:id="@ id/transf_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="1"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_margin="8dp"
            app:cardCornerRadius="8dp"
            app:cardElevation="8dp">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center"
                android:layout_gravity="center_vertical|center_horizontal">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_stat_transf" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Transfer Pacient"
                    android:textStyle="bold"
                    android:textAlignment="center"/>
            </LinearLayout>
        </androidx.cardview.widget.CardView>

        <androidx.cardview.widget.CardView
            android:id="@ id/stergere_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:cardBackgroundColor="@color/purple_200"
            android:layout_row="1"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_margin="5dp"
            app:cardCornerRadius="5dp"
            app:cardElevation="5dp">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_gravity="center_vertical|center_horizontal">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/ic_baseline_photo_camera_24" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="WORK IN PROGRESS"
                android:textStyle="bold"
                android:textAlignment="center"/>
        </LinearLayout>
        </androidx.cardview.widget.CardView>

        <androidx.cardview.widget.CardView
            android:id="@ id/logout_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:cardBackgroundColor="@color/purple_200"
            android:layout_row="2"
            android:layout_column="0"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_margin="5dp"
            app:cardCornerRadius="5dp"
            app:cardElevation="5dp">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center"
                android:layout_gravity="center_vertical|center_horizontal">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_baseline_photo_camera_24" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="NUME.EXE"
                    android:textStyle="bold"
                    android:textAlignment="center"/>
            </LinearLayout>
        </androidx.cardview.widget.CardView>
        <androidx.cardview.widget.CardView
            android:id="@ id/afisare_pacient"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:cardBackgroundColor="@color/purple_200"
            android:layout_row="2"
            android:layout_column="1"
            android:layout_gravity="fill"
            android:layout_rowWeight="1"
            android:layout_columnWeight="1"
            android:layout_margin="5dp"
            app:cardCornerRadius="5dp"
            app:cardElevation="5dp">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:gravity="center"
                android:layout_gravity="center_vertical|center_horizontal">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_baseline_photo_camera_24" />
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="INCA E"
                    android:textStyle="bold"
                    android:textAlignment="center"/>
            </LinearLayout>
        </androidx.cardview.widget.CardView>


    </GridLayout>




</RelativeLayout>
 

XML:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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="match_parent"
    android:background="@drawable/background1"
    tools:context=".Login">

    <TextView
        android:id="@ id/login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="84dp"
        android:text="Login"
        android:textColor="#E30F0F"
        android:textSize="38sp"
        android:textStyle="bold"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@ id/ID"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginTop="148dp"
        android:autofillHints=""
        android:background="#040404"
        android:drawableStart="@drawable/ic_action_id"
        android:ems="10"
        android:fontFamily="@font/roboto"
        android:hint="id"
        android:inputType="textPersonName"
        android:padding="10dp"
        android:textColor="#FFFFFF"
        android:textColorHint="#FAF9F9"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/login"
        tools:ignore="MissingConstraints" />

    <EditText
        android:id="@ id/Pw"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginTop="12dp"
        android:background="#040404"
        android:drawableStart="@drawable/ic_action_password"
        android:ems="10"
        android:fontFamily="@font/roboto"
        android:hint="password"
        android:inputType="textPassword"
        android:padding="10dp"
        android:textColor="#FFFFFF"
        android:textColorHint="#FAF9F9"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/ID"
        android:autofillHints="" />

    <Button
        android:id="@ id/loginBtn"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="144dp"
        android:text="login"
        app:backgroundTint="#E30F0F"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/Pw" />

    <ProgressBar
        android:id="@ id/progressBar"
        style="@style/Widget.AppCompat.ProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="48dp"
        android:progressDrawable="@drawable/background1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/loginBtn" />

</androidx.constraintlayout.widget.ConstraintLayout>
 

Комментарии:

1. Найдите себя logcat и добавьте в свой вопрос полное исключение.

2. Трассировка стека кажется довольно ясной: getCurrentUser возвращена null (так же, как в документации говорится, что это произойдет, если пользователь не вошел в систему), но вы предполагали, что она никогда не вернется null .

Ответ №1:

Проблема, похоже, исходит отсюда:

 final FirebaseUser user=firebaseAuth.getCurrentUser();
String  finaluser=(user).getEmail();
 

Это выглядит как firebaseAuth.getCurrentUser() возврат null , который затем приводит к (user).getEmail() сбою.

Если вы не уверены, что пользователь вошел в систему, вы можете проверить, так ли это, добавив проверку:

 final FirebaseUser user=firebaseAuth.getCurrentUser();
if (user != null) {
    String  finaluser=(user).getEmail();
    ...
 

Если вы считаете, что пользователь должен войти в систему, то, возможно, этот код запускается до того, как Firebase установит этот факт. Если это так, рассмотрите возможность использования прослушивателя состояния аутентификации, чтобы убедиться, что ваш код запускается только после того, как установлено состояние входа пользователя.