【问题标题】:Only safe or non null assserted calls are allowed on a nullable receiver type of arraylist在可空接收器类型的 arraylist 上只允许安全或非空断言调用
【发布时间】:2018-04-11 09:16:40
【问题描述】:

刚开始使用kotlin进行android开发。我的arraylist是这样声明的-

var day1: ArrayList<DietPlanDetailModel>? = null

现在我正在尝试按位置访问元素

    val dietPlan= day1[position]

但我得到低于编译时错误-

在可空对象上只允许安全或非空断言调用 arraylist 的接收者类型

为什么会出现这个错误,我该如何解决?

【问题讨论】:

    标签: android kotlin kotlin-null-safety


    【解决方案1】:

    问题是,您将ArrayList 定义为nullable。您有两种选择:

    1. 不要定义变量nullable(这取决于您的代码):
    var day1: ArrayList<DietPlanDetailModel> = ArrayList()
    
    1. 通过空检查访问您的数据结构:
    val dietPlan= day1?.get(position)
    

    【讨论】:

    • 'day1?.get(position)' 如果 day1 为 null,则返回 null。现在,如果我尝试访问 DietPlan 的 null 字段会发生什么情况?它会抛出 nullpointer 异常吗?
    • 当您使用nullable 类型时,您也必须始终考虑null-case。当dietPlannull 时,这取决于您的代码要做什么。所以想想当没有饮食计划返回时应该发生什么。
    【解决方案2】:

    按照定义,day1 可以是null,但您通过执行[] 来调用函数,这与调用day1.get(index) 基本相同。

    这可能会抛出 NullpointerException,Kotlin 编译器试图阻止它。因此,只允许这样的安全调用:day1?.get()

    【讨论】:

      【解决方案3】:

      您告诉编译器您的变量可以为 null(并为其分配 null)。

      day1[position] 本质上是day1.get(position),如果day1null,它将与NPE 崩溃-> null.get(position)

      如果您可以保证 day1 将被初始化,则推荐 lateinit 或直接分配带有声明的新 Arraylist。当然,简单的day1?.get(position) 也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 2015-05-15
        相关资源
        最近更新 更多