Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android studio Android Studio:初始化共享首选项导致活动启动崩溃_Android Studio_Kotlin - Fatal编程技术网

Android studio Android Studio:初始化共享首选项导致活动启动崩溃

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

我的android应用程序在主活动的活动启动时崩溃,但只有在我初始化SharedReferences对象时才会崩溃

在主要活动中:

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。
顺便说一句,接线员!!不安全,因为它可能引发KotlinNullPointerException

Try 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) 
绝对不要用!!对于一件有时肯定是空的事情,你最终只会后悔