Android studio Android Studio:初始化共享首选项导致活动启动崩溃
我的android应用程序在主活动的活动启动时崩溃,但只有在我初始化SharedReferences对象时才会崩溃 在主要活动中:Android studio Android Studio:初始化共享首选项导致活动启动崩溃,android-studio,kotlin,Android Studio,Kotlin,我的android应用程序在主活动的活动启动时崩溃,但只有在我初始化SharedReferences对象时才会崩溃 在主要活动中: package my.investing.investingtestapp import android.content.Intent import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.acti
package my.investing.investingtestapp
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnPlay.setOnClickListener {
// Handler code here.
val I = Intent(this, PlayActivity::class.java)
startActivity(I);
}
}
}
package my.company.example
import android.content.Context
import android.content.SharedPreferences
import android.content.SharedPreferences.Editor
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class PlayActivity : AppCompatActivity() {
val prefs: SharedPreferences? by lazy { this.getPreferences(Context.MODE_PRIVATE) }
val editor: Editor = prefs!!.edit()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_play2)
}
}
游戏中活动:
package my.investing.investingtestapp
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnPlay.setOnClickListener {
// Handler code here.
val I = Intent(this, PlayActivity::class.java)
startActivity(I);
}
}
}
package my.company.example
import android.content.Context
import android.content.SharedPreferences
import android.content.SharedPreferences.Editor
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class PlayActivity : AppCompatActivity() {
val prefs: SharedPreferences? by lazy { this.getPreferences(Context.MODE_PRIVATE) }
val editor: Editor = prefs!!.edit()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_play2)
}
}
以下情况也是如此:
val prefs = this.getPreferences(Context.MODE_PRIVATE)
错误:
java.lang.RuntimeException:无法实例化activity ComponentInfo{my.company.example/my.company.example.PlayActivity}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName”
在android.app.ActivityThread.PerformLaunchActivityActivityRead.java:3365
位于android.app.ActivityThread.handleLaunchActivityActivityRead.java:3601
在android.app.servertransaction.LaunchActivityItem.ExecuteLanchActivityItem.java:85
在android.app.servertransaction.TransactionExecutor.ExecuteCallbackTransactionExecutor.java:135
在android.app.servertransaction.TransactionExecutor.executeTransactionExecutor.java:95
在android.app.ActivityThread$H.handleMessageActivityThread.java:2066
在android.os.Handler.dispatchMessageHandler.java:106
在android.os.Looper.Looper.java:223
在android.app.ActivityThread.mainActivityThread.java:7656
在java.lang.reflect.Method.Invokenactive方法中
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.RuntimeInit.java:592
位于com.android.internal.os.ZygoteInit.mainZygoteInit.java:947
原因:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“java.lang.String android.content.Context.getPackageName”
位于android.content.ContextWrapper.getPackageNameContextWrapper.java:149
在android.app.Activity.getLocalClassNameActivity.java:6738
在android.app.Activity.getPreferencesActivity.java:6782
在my.company.example.PlayActivity$prefs$2.invokePlayActivity.kt:39
在my.company.example.PlayActivity$prefs$2.invokePlayActivity.kt:37
在kotlin.SynchronizedLazyImpl.getValueLazyJVM.kt:74
在my.company.example.PlayActivity.getPrefsUnknown中,来源:2
在my.company.example.PlayActivity.PlayActivity.kt:40
在java.lang.Class.NewInstancentive方法中
在android.app.AppComponentFactory.InstanceActivityAppComponentFactory.java:95
在androidx.core.app.CoreComponentFactory.instantialeActivityCorecomponentFactory.java:45
在android.app.Instrumentation.newActivityInstrumentation.java:1253
在android.app.ActivityThread.PerformLaunchActivityActivityRead.java:3353
位于android.app.ActivityThread.handleLaunchActivityActivityRead.java:3601
在android.app.servertransaction.LaunchActivityItem.ExecuteLanchActivityItem.java:85
在android.app.servertransaction.TransactionExecutor.ExecuteCallbackTransactionExecutor.java:135
在android.app.servertransaction.TransactionExecutor.executeTransactionExecutor.java:95
在android.app.ActivityThread$H.handleMessageActivityThread.java:2066
在android.os.Handler.dispatchMessageHandler.java:106
在android.os.Looper.Looper.java:223
在android.app.ActivityThread.mainActivityThread.java:7656
在java.lang.reflect.Method.Invokenactive方法中
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.RuntimeInit.java:592
在com.android.internal.os.ZygoteInit.mainZygoteInit.java:947中,只有在onCreate方法内部,才能调用从Activity继承的方法。在那之前,事情还没有准备好。
因此,在onCreate方法中初始化对象。只有在onCreate方法内部才能调用从Activity继承的方法。在那之前,事情还没有准备好。
因此,在onCreate方法中初始化对象。尝试使用editor=prefs?。在setcontentview之后编辑为onCreate。
顺便说一句,接线员!!不安全,因为它可能引发KotlinNullPointerExceptionTry to editor=prefs?。在setcontentview之后编辑为oncreate。
顺便说一句,接线员!!不安全,因为它可能引发KotlinNullPointerException特别是:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String android.content.Context.getPackageName()' on a null object
reference at
android.content.ContextWrapper.getPackageName(ContextWrapper.java:149) at
android.app.Activity.getLocalClassName(Activity.java:6738) at
android.app.Activity.getPreferences(Activity.java:6782) at
my.company.example.PlayActivity$prefs$2.invoke(PlayActivity.kt:39) at
它崩溃是因为您试图在空上下文上调用getPackageName,这是通过PlayActivity.kt第39行的prefs对象引起的getPreferences调用实现的
这些成员函数是在构建活动时初始化的,但此时活动还没有上下文-这在生命周期的后期发生,并且在调用onCreate时就准备好了。所以有些东西以后必须初始化lateinit对这样的事情很有用
您的惰性委托将正常工作—当某个对象访问它时,该活动将有其上下文。但当您初始化编辑器时,您将在下一行访问它,因此它总是在构造时运行,并且没有必要让它懒惰
无论如何,您可能不应该持有这样的编辑器引用,尤其是使用这样的东西,您可以一次编辑、设置和提交所有内容:
sharedPreferences.edit { putBoolean("key", value)
绝对不要用!!对于一件有时绝对可以为空的事情,你最终只会后悔具体地说,它是这样的:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String android.content.Context.getPackageName()' on a null object
reference at
android.content.ContextWrapper.getPackageName(ContextWrapper.java:149) at
android.app.Activity.getLocalClassName(Activity.java:6738) at
android.app.Activity.getPreferences(Activity.java:6782) at
my.company.example.PlayActivity$prefs$2.invoke(PlayActivity.kt:39) at
它是
崩溃是因为您试图在空上下文上调用getPackageName,这是通过PlayActivity.kt第39行的prefs对象引起的getPreferences调用发生的
这些成员函数是在构建活动时初始化的,但此时活动还没有上下文-这在生命周期的后期发生,并且在调用onCreate时就准备好了。所以有些东西以后必须初始化lateinit对这样的事情很有用
您的惰性委托将正常工作—当某个对象访问它时,该活动将有其上下文。但当您初始化编辑器时,您将在下一行访问它,因此它总是在构造时运行,并且没有必要让它懒惰
无论如何,您可能不应该持有这样的编辑器引用,尤其是使用这样的东西,您可以一次编辑、设置和提交所有内容:
sharedPreferences.edit { putBoolean("key", value)
绝对不要用!!对于一件有时肯定是空的事情,你最终只会后悔