为什么即使我采取了预防措施,我仍会得到零点异常?

时间:2018-08-15 20:49:41

标签: android kotlin null

如何防范零分?我尝试过这种方式:

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)通过了...

1 个答案:

答案 0 :(得分:0)

简而言之,您错过了问号。

您希望在代码段中输入

spr.getString("KEY", null).let { it }

不会为空吗?那是不对的。

正确的语法是

spr.getString("KEY", null)?.let { it }

容易错过。

使用嵌套JSON也是一样。您永远不要在Kotlin中使用bang-bang(!!)。请改用安全语法:

recipeArray?[counterX].recipeKey