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
相关产品推荐
相关产品推荐

