Kotlin编译器说即使具有默认值,getString()还是可以为空

时间:2019-04-20 02:36:14

标签: android kotlin

我的代码:

var users: MutableList<String> = mutableListOf()
lateinit var players: ArrayList<Player>


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val sharedPrefPlayers = activity?.getPreferences(Context.MODE_PRIVATE)
    sharedPrefPlayers?.all?.keys?.forEach {
        val filename = "player_$it"
        val playerSharedPref = activity?.getSharedPreferences(filename, Context.MODE_PRIVATE)
        players.add(Player(playerSharedPref!!.getString("name", ""), playerSharedPref.getInt("age", 0), playerSharedPref.getString("gender", "male")))
    }
    players = arrayListOf()
}

我在上面的Type Mismatch - Required: String, Found: String?通话中收到getString()。我不确定String是否可以为空,因为如果找不到“名称”,则默认为""的String背景。

此外,getInt()调用没有该错误。

有什么主意吗?

1 个答案:

答案 0 :(得分:2)

根据Android Documentation,这是因为SharedPreferences.getString(key, defValue)可为空。

换句话说,getString(String, String)的{​​{1}}如下。

SharedPreferences

因此,即使您传递了非null字符串,Kotlin仍然认为@Nullable String getString(String key, @Nullable String defValue); 可能为null。

您可以通过确保playerSharedPref!!.getString("name", "")为非空值来解决此问题。

解决方案: 将playerSharedPref!!.getString("name", "")放在!!的末尾,因此结果将是playerSharedPref!!.getString("name", "")

希望这会有所帮助!