Android 此.getPreferences()上的NullPointerException

Android 此.getPreferences()上的NullPointerException,android,kotlin,nullpointerexception,Android,Kotlin,Nullpointerexception,我试图通过调用this.getPreferences()来创建对我的活动的默认共享首选项文件的引用 结果给了我一个NullPointerException-为什么?它与UI没有关联,因此不需要在setContentView()之后调用它。为什么此时活动将为null?最安全的调用位置是在super.onCreate(savedInstnaceState)之后 调用此命令最安全的地方是在super.onCreate(savedInstnaceState)之后 将行在super.onCreate之后的

我试图通过调用
this.getPreferences()
来创建对我的活动的默认共享首选项文件的引用


结果给了我一个
NullPointerException
-为什么?它与UI没有关联,因此不需要在
setContentView()之后调用它。为什么此时活动将为
null

最安全的调用位置是在
super.onCreate(savedInstnaceState)
之后

调用此命令最安全的地方是在
super.onCreate(savedInstnaceState)
之后

将行在super.onCreate之后的onCreate内移动

class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher {

    val sharedPref = this.getPreferences(Context.MODE_PRIVATE) // NPE
    var applicationID = sharedPref.getString("applicationID", null)

    private lateinit var binding: ActivityPlayerDetailsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
        ...
    }
...

在super.onCreate之后将行移到onCreate内部

class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher {

    val sharedPref = this.getPreferences(Context.MODE_PRIVATE) // NPE
    var applicationID = sharedPref.getString("applicationID", null)

    private lateinit var binding: ActivityPlayerDetailsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
        ...
    }
...

通过执行此操作,您从AppCompatActivity调用了inherit方法。getPreferences(Context.MODE\u PRIVATE),因为onCreate是启动活动时的第一个回调,所以还没有进行设置。

通过执行此操作,您从AppCompatActivity调用了inherit方法,由于onCreate是启动活动时的第一个回调,所以还没有设置

它与UI没有关联,因此不需要在之后调用它 setContentView()

是的,但必须在以下时间后调用:

val PREFS_NAME = "com.teamtreehouse.colorsarefun.prefs"
var prefs: SharedPreferences? = null

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            prefs =  = this.getSharedPreferences(PREFS_FILENAME, 0)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
            ...
        }
因为
引用活动的
上下文
,并且此
上下文
仅在调用后有效。
因此,您可以将声明更改为:

super.onCreate(savedInstanceState)
这样,在调用
super.onCreate(savedInstanceState)
后,第一次使用它时将初始化
SharedRef
阅读更多关于

它与UI没有关联,因此不需要在之后调用它 setContentView()

是的,但必须在以下时间后调用:

val PREFS_NAME = "com.teamtreehouse.colorsarefun.prefs"
var prefs: SharedPreferences? = null

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            prefs =  = this.getSharedPreferences(PREFS_FILENAME, 0)
            binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
            ...
        }
因为
引用活动的
上下文
,并且此
上下文
仅在调用后有效。
因此,您可以将声明更改为:

super.onCreate(savedInstanceState)
这样,在调用
super.onCreate(savedInstanceState)
后,第一次使用它时将初始化
SharedRef

了解更多信息。

我不想将其移动到onCreate中,因为我希望它可以被我的系统中的其他函数访问activity@Zorgan将prefs作为类变量,然后在onCreate()@Zorgan中使用这个.getSharedReferences(),请参考更新的代码。您可以在活动中的任何位置引用“prefs”。我不希望在创建时将其移到内部,因为我希望它可以被活动中的其他函数访问activity@Zorgan将prefs作为类变量,然后在onCreate()@Zorgan中使用这个.getSharedReferences(),请参考更新的代码。您可以在活动中的任何地方引用“prefs”谢谢。但是,如果我想在
onCreate()
之前引用
sharedPref
val,该怎么办?(如果您想查看,我已经更新了代码)。因为我希望
applicationID
成为整个类的公共变量。只有在初始化SharedRef`之后才能初始化applicationID`。谢谢。但是,如果我想在
onCreate()
之前引用
sharedPref
val,该怎么办?(如果您想查看,我已经更新了代码)。因为我希望
applicationID
成为整个类的公共变量。只有在初始化SharedRef`之后才能初始化applicationID`。