android - java.lang.RuntimeException:无法启动活动 ComponentInfo{at.mksquad.swapit/at.mksquad.swapit.ui.screenflow.main.MainActivity}?
问题描述
我正在开发新应用程序,但是当我在调试模式下运行项目时,出现以下异常
java.lang.RuntimeException: Unable to start activity ComponentInfo{at.mksquad.swapit/at.mksquad.swapit.ui.screenflow.main.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2976)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3113)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6820)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
Caused by: java.lang.NullPointerException
at at.mksquad.swapit.data.sources.auth.AuthSourceFirebase.getUidOfLoggedInUser(AuthSourceFirebase.kt:18)
at at.mksquad.swapit.features.auth.AuthManager.getUidOfLoggedInUser(AuthManager.kt:28)
at at.mksquad.swapit.data.repositories.UserRepository.getUid(UserRepository.kt:30)
at at.mksquad.swapit.utils.UserUtil.createNewUser(UserUtil.kt:17)
at at.mksquad.swapit.data.repositories.UserRepository.loadUser(UserRepository.kt:90)
at at.mksquad.swapit.ui.screenflow.main.SharedViewModel.<init>(SharedViewModel.kt:12)
at at.mksquad.swapit.ui.screenflow.main.SharedViewModelFactory.create(SharedViewModelFactory.kt:14)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54)
at androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41)
at at.mksquad.swapit.ui.screenflow.main.MainActivity.getSharedViewModel(Unknown Source:2)
at at.mksquad.swapit.ui.screenflow.main.MainActivity.prepareViews(MainActivity.kt:765)
at at.mksquad.swapit.ui.screenflow.main.MainActivity.onCreate(MainActivity.kt:194)
at android.app.Activity.performCreate(Activity.java:7224)
at android.app.Activity.performCreate(Activity.java:7213)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2956)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3113)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:201)
at android.app.ActivityThread.main(ActivityThread.java:6820)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
下面跟随我的 MainActivity.kt https://gist.github.com/kyodgorbek/2a369fcbb2138cb9e25c0855514dc162代码
我想知道我到底在哪里犯了错误我已经运行调试模式但逐步运行但它没有显示任何内容,但在 AuthSourceFirebase.kt 中的以下代码中指出异常
object AuthSourceFirebase {
fun isUserLoggedIn(): Boolean {
return FirebaseAuth.getInstance().currentUser != null
}
fun getUidOfLoggedInUser(): String {
return FirebaseAuth.getInstance().currentUser!!.uid // this line cause exception
}
fun loginUser(
activity: Activity,
mail: String,
password: String,
loginCallback: AuthManager.UserLoginCallback
) {
Timber.d("Starting process to login..")
FirebaseAuth.getInstance().signInWithEmailAndPassword(
mail,
password
).addOnCompleteListener(activity) {
if (it.isSuccessful) {
loginCallback.onCallback(null)
}
}
.addOnFailureListener { e ->
val error = e as FirebaseAuthException
Timber.d("Error logging in, code: %s", error.errorCode)
loginCallback.onCallback(
LibFirebaseErrors.getErrorFromErrorCode(
activity,
error.errorCode
)
)
}
}
fun registerUser(
activity: Activity,
mail: String,
password: String,
registrationCallback: AuthManager.UserRegistrationCallback
) {
Timber.d("Starting process to register..")
FirebaseAuth.getInstance().createUserWithEmailAndPassword(
mail,
password
).addOnCompleteListener(activity) {
if (it.isSuccessful) {
registrationCallback.onCallback(null)
}
}
.addOnFailureListener { e ->
val error = e as FirebaseAuthException
Timber.d("Error logging in, code: %s", error.errorCode)
registrationCallback.onCallback(
LibFirebaseErrors.getErrorFromErrorCode(activity, error.errorCode)
)
}
}
fun sendPasswordResetMail(
activity: Activity,
mail: String,
resetPwMailCallback: AuthManager.UserResetPwMailCallback
) {
Timber.d("Starting process to reset password..")
FirebaseAuth.getInstance().sendPasswordResetEmail(mail)
.addOnCompleteListener(activity) {
if (it.isSuccessful) {
resetPwMailCallback.onCallback(null)
}
}
.addOnFailureListener { e ->
val error = e as FirebaseAuthException
Timber.d("Error sending mail, code: %s", error.errorCode)
resetPwMailCallback.onCallback(
LibFirebaseErrors.getErrorFromErrorCode(
activity,
error.errorCode
)
)
}
}
fun logUserOut(context: Context){
UserRepository.deleteUserLocal(context)
FirebaseAuth.getInstance().signOut()
}
}
我已经尝试过我的方法以避免空指针异常,因为它不起作用
fun getUidOfLoggedInUser(): String {
if(FirebaseAuth.getInstance().currentUser?.uid == null){
FirebaseAuth.getInstance().signOut()
}
return FirebaseAuth.getInstance().currentUser!!.uid
}
解决方案
您得到的错误看起来像一个常规的空指针异常。根据此处的异常堆栈跟踪:
Caused by: java.lang.NullPointerException
at at.mksquad.swapit.data.sources.auth.AuthSourceFirebase.**getUidOfLoggedInUser(AuthSourceFirebase.kt:18)**
at at.mksquad.swapit.features.auth.AuthManager.getUidOfLoggedInUser(AuthManager.kt:28)
at at.mksquad.swapit.data.repositories.UserRepository.getUid(UserRepository.kt:30)
和
fun getUidOfLoggedInUser(): String {
return FirebaseAuth.getInstance().currentUser!!.uid // this line cause exception
}
确保您的 currentUser 不为空。请检查 Firebase 身份验证是否已处理且当前用户会话是否处于活动状态。
像这样更新您的代码:
**fun getUidOfLoggedInUser(): String {
if(FirebaseAuth.getInstance().currentUser == null || FirebaseAuth.getInstance().currentUser?.uid == null){
FirebaseAuth.getInstance().signOut() return
}
return FirebaseAuth.getInstance().currentUser!!.uid
}**
推荐阅读
- java - Springboot:注入bean时ScriptUtils不会在H2中播种数据
- javascript - 如何使用 Vue 路由器将数据传递给另一个组件?
- for-loop - 仅循环的批处理文件计数为 8
- python - 使用 Json Python 格式化 Websocket 数据
- java - 用于两个类似命名元素的 JAXB XJB
- python - 来自预训练张量流模型的混淆矩阵
- doxygen - Doxygen 没有提取所有文件
- google-bigquery - BigQuery 安全性:对数据集施加 DDL 限制
- android - 如何在 Firebase 数据库中获取内部孩子的数据?
- java - IntelliJ 不会解析使用 mvc:resources 定义的路径