# #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 установит этот факт. Если это так, рассмотрите возможность использования прослушивателя состояния аутентификации, чтобы убедиться, что ваш код запускается только после того, как установлено состояние входа пользователя.