如何防止空分?我尝试了这种方式:
var spr = context.getSharedPreferences("FAV", Context.MODE_PRIVATE)
var emptyArray: JsonArray = jsonArray()
var myjson = spr.getString("KEY", null)
//GET JSON FROM SHARED PREFERENCE
Log.d("TAG", "NOT NULL")
if(myjson != null) {
var parsedFavFromJson = Gson().fromJson<List<String>>(myjson)
//PARSE FROM JSON TO ARRAY
for (i in parsedFavFromJson) {
emptyArray.add(i)
Log.d("TAG", "" + i)
if (i == recipeArray!![counterX].recipeKey!!) {
Picasso.with(context)
.load(R.drawable.fav_icon_60at3x).into(favMarkerButton)
Log.d("TAG", "Match " + i)
} else {
Log.d("TAG", "WAS NULL")
Picasso.with(context)
.load(R.drawable.fav_unclicked_icon60at3x).into(favMarkerButton)
}
}
}
我已经清楚地说明了条件if(myjson != null)
,它仍然通过并崩溃并显示错误消息java.lang.IllegalStateException: fromJson(json, typeToken<T>()) must not be null
。没有明确指示错误实际发生的位置 - 它实际上指向一个空代码行!如果我删除上面的代码,一切正常。我也尝试使用:
var myjson = spr.getString("KEY", null).let {
。等等,结果是一样的。我在这里错过了什么吗?
更新我检查了变量myjson
,它显然是null
.问题是为什么有条件的if(myjson != null)
通过了...
简而言之,你错过了问号。
您希望在块中:
spr.getString("KEY", null).let { it }
不会为空吗?这是不正确的。
正确的语法是
spr.getString("KEY", null)?.let { it }
容易错过。
使用嵌套 JSON 也是如此。你永远不应该在 Kotlin 中使用 bang-bang (!!
(。请改用安全语法:
recipeArray?[counterX].recipeKey