【问题标题】:Return null from fun in kotlin从 kotlin 中的 fun 返回 null
【发布时间】:2018-02-16 08:09:49
【问题描述】:

我编写了一个函数来执行数据库查询。如果它无法获取任何结果,我希望它返回 null

fun getServiceCharge(model: String): ServiceChargeMasterList {
    val unique = VideoconApplication.daoSession.serviceChargeMasterListDao.queryBuilder().where(ServiceChargeMasterListDao.Properties.ModelCategory.eq(model)).unique()
    if (unique != null)
        return unique
    else
        return null!!
}

它给了我kotlin.KotlinNullPointerException

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: android nullpointerexception kotlin


    【解决方案1】:

    只需将您的返回类型指定为ServiceChargeMasterList? 并返回null!! 操作符很难用。

    如果您的 unique() 方法返回和可选(或 Java 对象),您甚至不必使用该 if 语句。在这种情况下,您的方法可能如下所示:

    fun getServiceCharge(model: String): ServiceChargeMasterList? {
        return VideoconApplication.daoSession.serviceChargeMasterListDao.queryBuilder().where(ServiceChargeMasterListDao.Properties.ModelCategory.eq(model)).unique()
    }
    

    【讨论】:

      【解决方案2】:

      使用这个

      fun getServiceCharge(model: String): ServiceChargeMasterList? = 
          VideoconApplication.
          daoSession.
          serviceChargeMasterListDao.
          queryBuilder().
          where(ServiceChargeMasterListDao.Properties.ModelCategory.eq(model)).
          unique()
      

      说明

      在 Kotlin 中,有 可选类型。如果你返回 ServiceChargeMasterList,你就告诉编译器你永远不会返回 null。如果要返回 null,则必须添加 ?类型末尾的符号表示可以返回 ServiceChargeMasterList 的实例或 null。

      运营商!!在Java中可以解释为

      //Kotlin
      variable!!
      
      
      //Java
      if (variable == null)
          throw new kotlin.NullPointerException();
      

      【讨论】:

        【解决方案3】:

        您的方法的返回类型不允许返回null。您需要将其更改为可空版本ServiceChargeMasterList?(可空性由问号表示)。

        非空断言运算符!! 只应在极少数情况下使用,因为它会尝试将可空类型转换为不可空类型并且可能会抛出NullPointerException 在@ 上调用时987654325@。 您的代码null!! 就是对此的完美演示。

        不是像nullableVar?.foo() 那样应用安全运算符,而是像这样使用这个运算符:nullableVar!!.foo()

        但在您的情况下,!! 运算符是错误的选择。如果您的方法确实应该返回 null,请更改返回类型。

        【讨论】:

          【解决方案4】:
          open fun getProfile() : ProfileModel? {
              if (MyApplication.sharedPreference.getString("profile","")!=null){
                  var profileModel : ProfileModel = Profile()
                  return profileModel
              }
              return null 
          }
          

          添加 ?在你的返回类型之后然后return null它工作

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-05-27
            • 1970-01-01
            • 2023-01-05
            相关资源
            最近更新 更多