Java 获取NPE无法启动活动:即使使用setContentView,也尝试对空对象引用调用虚拟方法
我将遵循本教程探索Firebase并使用电子邮件身份验证 三个java类Java 获取NPE无法启动活动:即使使用setContentView,也尝试对空对象引用调用虚拟方法,java,android,xml,firebase,android-studio,Java,Android,Xml,Firebase,Android Studio,我将遵循本教程探索Firebase并使用电子邮件身份验证 三个java类 主要活动 注册活动 轮廓活动 及 三个布局视图 activity_main.xml activity_register.xml profilepage.xml [] 我要走了 java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.firebaselearning/com.example.firebaselearning.RegisterActiv
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.firebaselearning, PID: 8008
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.firebaselearning/com.example.firebaselearning.RegisterActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.firebaselearning.RegisterActivity.onCreate(RegisterActivity.java:60)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
以下是代码(不包括gradle,因为我认为这不是错误的来源)
MainActivity.java
public class MainActivity extends AppCompatActivity {
//views
Button mRegisterBtn, mLogInBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initialise view
mRegisterBtn = findViewById(R.id.registerbutton);
mLogInBtn = findViewById(R.id.login);
//handle register button click
mRegisterBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start register activity
startActivity(new Intent(MainActivity.this, RegisterActivity.class));
}
});
}
}
public class RegisterActivity extends AppCompatActivity {
//views
EditText mEmailET, mPassword;
Button mRegistrationBTN;
//progressbar to display progress which registering
ProgressDialog progressDialog;
//declare instance of fireAuth
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//actionbar and its title
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("Create Account");
//enable back button
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
//init
mEmailET = findViewById(R.id.editTextTextEmailAddress);
mPassword = findViewById(R.id.editTextTextPassword);
mRegistrationBTN = findViewById(R.id.registerbutton);
//initialising firebaseAuth instance
mAuth = FirebaseAuth.getInstance();
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Registering user ...");
//handle register btn click
mRegistrationBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//input email, password
String email = mEmailET.getText().toString().trim();
String password = mPassword.getText().toString().trim();
//validate
if(Patterns.EMAIL_ADDRESS.matcher(email).matches()){
//show error and focus to edittext
mEmailET.setError("Invalid Email");
mEmailET.setFocusable(true);
}else if (password.length()<6){
//set error and focus to password
mPassword.setError("Password length must be at least 6 characters");
mPassword.setFocusable(true);
}else{
//register the user
registerUser(email,password);
}
}
});
}
private void registerUser(String email, String password){
//email and password is valid ,shows progress dialog and start registering user
progressDialog.show();
mAuth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, dismiss dialog and start register activity
progressDialog.dismiss();
FirebaseUser user = mAuth.getCurrentUser();
assert user != null;
Toast.makeText(RegisterActivity.this,"Registered..."+user.getEmail(), Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterActivity.this, ProfileActivity.class));
finish();
} else {
// If sign in fails, display a message to the user.
progressDialog.dismiss();
Toast.makeText(RegisterActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
}
}) .addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//error, dismiss progrss dialog and get and show error message
progressDialog.dismiss();
Toast.makeText(RegisterActivity.this,""+e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed(); //go previous activity on clicking back
return super.onSupportNavigateUp();
}
}
RegisterActivity.java
public class MainActivity extends AppCompatActivity {
//views
Button mRegisterBtn, mLogInBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//initialise view
mRegisterBtn = findViewById(R.id.registerbutton);
mLogInBtn = findViewById(R.id.login);
//handle register button click
mRegisterBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//start register activity
startActivity(new Intent(MainActivity.this, RegisterActivity.class));
}
});
}
}
public class RegisterActivity extends AppCompatActivity {
//views
EditText mEmailET, mPassword;
Button mRegistrationBTN;
//progressbar to display progress which registering
ProgressDialog progressDialog;
//declare instance of fireAuth
private FirebaseAuth mAuth;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
//actionbar and its title
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("Create Account");
//enable back button
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
//init
mEmailET = findViewById(R.id.editTextTextEmailAddress);
mPassword = findViewById(R.id.editTextTextPassword);
mRegistrationBTN = findViewById(R.id.registerbutton);
//initialising firebaseAuth instance
mAuth = FirebaseAuth.getInstance();
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Registering user ...");
//handle register btn click
mRegistrationBTN.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//input email, password
String email = mEmailET.getText().toString().trim();
String password = mPassword.getText().toString().trim();
//validate
if(Patterns.EMAIL_ADDRESS.matcher(email).matches()){
//show error and focus to edittext
mEmailET.setError("Invalid Email");
mEmailET.setFocusable(true);
}else if (password.length()<6){
//set error and focus to password
mPassword.setError("Password length must be at least 6 characters");
mPassword.setFocusable(true);
}else{
//register the user
registerUser(email,password);
}
}
});
}
private void registerUser(String email, String password){
//email and password is valid ,shows progress dialog and start registering user
progressDialog.show();
mAuth.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, dismiss dialog and start register activity
progressDialog.dismiss();
FirebaseUser user = mAuth.getCurrentUser();
assert user != null;
Toast.makeText(RegisterActivity.this,"Registered..."+user.getEmail(), Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterActivity.this, ProfileActivity.class));
finish();
} else {
// If sign in fails, display a message to the user.
progressDialog.dismiss();
Toast.makeText(RegisterActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
}
}
}) .addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//error, dismiss progrss dialog and get and show error message
progressDialog.dismiss();
Toast.makeText(RegisterActivity.this,""+e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onSupportNavigateUp() {
onBackPressed(); //go previous activity on clicking back
return super.onSupportNavigateUp();
}
}
公共类注册表活动扩展了AppCompatActivity{
//观点
EditText mEmailET,mPassword;
按钮MRRegistrationBTN;
//progressbar以显示正在注册的进度
进行对话进行对话;
//声明fireAuth的实例
私人消防队;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u寄存器);
//actionbar及其标题
ActionBar ActionBar=getSupportActionBar();
actionBar.setTitle(“创建账户”);
//启用后退按钮
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setDisplayShowHomeEnabled(真);
//初始化
mEmailET=findviewbyd(R.id.editTextEmailAddress);
mPassword=findviewbyd(R.id.editTextPassword);
mrRegistrationBTN=findViewById(R.id.registerbutton);
//初始化firebaseAuth实例
mAuth=FirebaseAuth.getInstance();
progressDialog=新建progressDialog(此);
progressDialog.setMessage(“注册用户…”);
//处理注册btn点击
mrRegistrationBTN.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//输入电子邮件、密码
字符串email=mEmailET.getText().toString().trim();
字符串密码=mPassword.getText().toString().trim();
//证实
if(Patterns.EMAIL\u ADDRESS.matcher(EMAIL.matches()){
//向编辑文本显示错误和焦点
mEmailET.setError(“无效电子邮件”);
mEmailET.setFocusable(真);
}else if(password.length()错误是由于引用了activity_main.xml布局(MainActivity视图)和RegisterActivity(activity_register.xml视图中有另一个register按钮)中的register按钮引起的
很抱歉浪费你的时间
.
因此,activity_main中的register按钮没有在register.java中初始化。它在哪一行出错?我已经解决了错误,我不小心使用了“@+id/registerbutton”布局约束时出现两次。另外,由于从错误的java类中引用了错误的按钮。出现错误的原因是从RegisterActivity.java中引用了activity_main.xml中的register按钮,该按钮的布局视图为activity_register.xml,另一个按钮名为register