【问题标题】:Kotlin: sharedPreferences NullPointerExceptionKotlin:sharedPreferences NullPointerException
【发布时间】:2021-04-24 10:51:12
【问题描述】:

我正在尝试将令牌存储在 sharedPreferences 中。但我不能这样做,因为有一个错误。 !!附加到上下文中。但似乎因为上下文为空而发生错误。 有没有办法解决这个问题?下面附上我写的代码

import android.content.Context
import android.content.SharedPreferences

class SharedPreferencesManager {
    private val sharedPreferences: SharedPreferences = TikiTakaApplication.context!!.getSharedPreferences(MY_APP_PREFERENCES, Context.MODE_PRIVATE)

    var accessToken: String?
        get() = sharedPreferences.getString(SAVE_TOKEN,null)
        set(value)= sharedPreferences.edit().putString(SAVE_TOKEN,value).apply()

    var refreshToken: String?
        get() = sharedPreferences.getString(SAVE_REFRESH, null)
        set(value) = sharedPreferences.edit().putString(SAVE_REFRESH,value).apply()


    companion object {
        private const val MY_APP_PREFERENCES = "TikiTaka-Android"
        private const val SAVE_TOKEN = "accessToken"
        private const val SAVE_REFRESH = "refreshToken"
        private var instance: SharedPreferencesManager? = null

        @Synchronized
        fun getInstance(): SharedPreferencesManager {
            if (instance == null) instance = SharedPreferencesManager()
            return instance!!
        }
    }
}

日志猫

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tikitaka_android, PID: 13265
java.lang.NullPointerException
    at com.example.tikitaka_android.Util.SharedPreferencesManager.<init>(SharedPreferencesManager.kt:7)
    at com.example.tikitaka_android.Util.SharedPreferencesManager$Companion.getInstance(SharedPreferencesManager.kt:26)
    at com.example.tikitaka_android.Base.BaseRepository.<init>(BaseRepository.kt:9)
    at com.example.tikitaka_android.Sign.Data.SignRepository.<init>(SignRepository.kt:7)
    at com.example.tikitaka_android.Sign.ViewModel.SignUpViewModel.<init>(SignUpViewModel.kt:12)
    at java.lang.Class.newInstance(Native Method)
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
    at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
    at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:185)
    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 com.example.tikitaka_android.Sign.Ui.Fragment.SignUpFragment.getViewModel(Unknown Source:2)
    at com.example.tikitaka_android.Sign.Ui.Fragment.SignUpFragment.loginAfterCheck(SignUpFragment.kt:51)
    at com.example.tikitaka_android.Sign.Ui.Fragment.SignUpFragment.access$loginAfterCheck(SignUpFragment.kt:17)
    at com.example.tikitaka_android.Sign.Ui.Fragment.SignUpFragment$onActivityCreated$1.onClick(SignUpFragment.kt:32)
    at android.view.View.performClick(View.java:6294)
    at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

【问题讨论】:

  • 确保上下文不为空。 !! 不会神奇地赋值。另外,请发布错误的logcat。
  • 我添加到正文中

标签: android kotlin nullpointerexception sharedpreferences


【解决方案1】:

您可以尝试这种方式来使用 SharedPreferences:

SharedPreferencesHelper 类:

object SharedPreferencesHelper {
fun defaultPrefs(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
fun customPrefs(context: Context, name: String): SharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE)
inline fun SharedPreferences.edit(operation: (SharedPreferences.Editor) -> Unit) {
    val editor = this.edit()
    operation(editor)
    editor.apply()
 }
}

operator fun SharedPreferences.set(key: String, value: Any?) {
when (value) {
    is String? -> edit { it.putString(key, value) }
    is Int -> edit { it.putInt(key, value) }
    is Boolean -> edit { it.putBoolean(key, value) }
    is Float -> edit { it.putFloat(key, value) }
    is Long -> edit { it.putLong(key, value) }
    else -> throw UnsupportedOperationException("Not yet implemented")
 }
}

operator inline fun <reified T : Any> SharedPreferences.get(key: String, defaultValue: T? = null): T? {
return when (T::class) {
    String::class -> getString(key, defaultValue as? String) as T?
    Int::class -> getInt(key, defaultValue as? Int ?: -1) as T?
    Boolean::class -> getBoolean(key, defaultValue as? Boolean ?: false) as T?
    Float::class -> getFloat(key, defaultValue as? Float ?: -1f) as T?
    Long::class -> getLong(key, defaultValue as? Long ?: -1) as T?
    else -> throw UnsupportedOperationException("Not yet implemented")
 }
}

在您的 Activity 或 Fragment 中:

    protected val prefs: SharedPreferences by lazy { SharedPreferencesHelper.customPrefs(requireContext(), Objects.SHARED_PREFS) }

您要保存到 SharedPreferences 中的 Activity 或 Fragment 中的任何位置:

var APP_PASSWORD: String = ""
prefs[APP_PASSWORD] = "123456"

【讨论】:

    【解决方案2】:

    你需要在访问上下文的值之前添加空检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-10
      • 2015-01-30
      • 2013-10-28
      • 2012-05-26
      • 2014-04-28
      • 2015-02-28
      • 2021-05-11
      • 2014-07-27
      相关资源
      最近更新 更多