You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Kotlin Android应用跳转RegisterActivity时崩溃求助

解决RegisterActivity跳转时的空指针崩溃问题

我仔细看了你的Logcat日志和代码,立刻就找到崩溃的原因了——你在RegisterActivity的类成员级别直接调用findViewById和初始化Intent,但此时Activity还没完成初始化,Context处于null状态,这就引发了日志里的空指针异常。

问题根源

在Kotlin中,类的成员变量会在Activity实例化(<init>阶段)时就被初始化,但此时:

  • Activity的onCreate方法还没执行,setContentView(R.layout.activity_register)也没调用,布局还没加载,findViewById根本找不到控件
  • Activity的Context还未完全初始化,调用Intent(this, LoginActivity::class.java)时的this是无效的空引用

修复方案

把控件变量改成lateinit延迟初始化,将findViewById和Intent的初始化逻辑移到onCreate方法中,且必须在setContentView之后执行:

修改后的RegisterActivity代码:

package konark.studios.ourtimetable
import android.content.Intent
import android.os.Bundle
import android.util.Patterns
import android.view.WindowManager
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase

class RegisterActivity : AppCompatActivity() {
    // 用lateinit声明变量,延迟初始化
    private lateinit var registerBtn: Button
    private lateinit var usernamebox: EditText
    private lateinit var passwordbox: EditText
    private lateinit var auth: FirebaseAuth
    private lateinit var intentLoginActivity: Intent

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
        setContentView(R.layout.activity_register) // 先加载布局
        supportActionBar?.hide()

        // 现在可以安全地初始化控件和Intent了
        registerBtn = findViewById(R.id.RegisterButton)
        usernamebox = findViewById(R.id.emailbox)
        passwordbox = findViewById(R.id.passwordbox)
        intentLoginActivity = Intent(this, LoginActivity::class.java)
        
        auth = Firebase.auth
        registerBtn.setOnClickListener {
            signUpUser()
        }
    }

    private fun signUpUser() {
        if (usernamebox.text.toString().isEmpty()) {
            usernamebox.error = "Please enter your email"
            usernamebox.requestFocus()
            return
        }
        // 修正邮箱格式判断逻辑:格式不正确时才提示错误
        if (!Patterns.EMAIL_ADDRESS.matcher(usernamebox.text.toString()).matches()) {
            usernamebox.error = "Please enter a valid email"
            usernamebox.requestFocus()
            return
        }
        if (passwordbox.text.toString().isEmpty()) {
            passwordbox.error = "Please enter a password"
            passwordbox.requestFocus()
            return
        }

        auth.createUserWithEmailAndPassword(usernamebox.text.toString(), passwordbox.text.toString())
            .addOnCompleteListener(this) { task ->
                if (task.isSuccessful) {
                    startActivity(intentLoginActivity)
                    finish() // 关闭当前注册页面,避免用户返回重复操作
                } else {
                    // 显示具体错误信息,方便排查问题
                    Toast.makeText(baseContext, "Authentication failed: ${task.exception?.message}", Toast.LENGTH_SHORT).show()
                }
            }
    }
}

额外优化提示

我还发现你signUpUser方法里的邮箱验证逻辑写反了:原来的代码是当邮箱格式正确时提示错误,我已经在修复后的代码里修正了这个问题。另外,登录成功后调用finish()可以关闭注册页面,提升用户体验。

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:42:22