Java 获取NPE无法启动活动:即使使用setContentView,也尝试对空对象引用调用虚拟方法

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

我将遵循本教程探索Firebase并使用电子邮件身份验证 三个java类

  • 主要活动
  • 注册活动
  • 轮廓活动
  • 及 三个布局视图

  • activity_main.xml
  • activity_register.xml
  • profilepage.xml
  • [] 我要走了

    java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.firebaselearning/com.example.firebaselearning.RegisterActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.view$OnClickListener)'

    完全错误

    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