在kotlin中从null中返回null

时间:2017-09-07 14:24:53

标签: android nullpointerexception kotlin

我编写了一个执行数据库查询的函数。如果它无法获取任何结果,我希望它返回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

有谁能告诉我怎么解决这个问题?

4 个答案:

答案 0 :(得分:10)

只需将您的退货类型指定为ServiceChargeMasterList?并返回null即可。使用!!运算符非常难看。

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

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

答案 1 :(得分:6)

使用此

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();

答案 2 :(得分:2)

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

非空断言运算符!!只应在极少数情况下使用,因为它试图将可空类型转换为非可空类型,而可能会抛出 a NullPointerExceptionnull上调用时。 您的代码null!!就是完美的演示。

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

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

答案 3 :(得分:0)

<?xml version="1.0"?>  
<configuration>  

  <system.web>  
    <compilation debug="true" targetFramework="4.0" />  
  </system.web>  
  <system.serviceModel>  
    <services>  
      <service name="MySecureWCFService.Service1">  
        <endpoint address=""  
                  binding="basicHttpBinding"  
                  bindingConfiguration="secureHttpBinding"  
                  contract="MySecureWCFService.IService1"/>  

        <endpoint address="mex"  
                  binding="mexHttpsBinding"  
                  contract="IMetadataExchange" />  
      </service>  
    </services>  
    <bindings>  
      <basicHttpBinding>  
        <binding name="secureHttpBinding">  
          <security mode="Transport">  
            <transport clientCredentialType="None"/>  
          </security>  
        </binding>  
      </basicHttpBinding>  
    </bindings>  
    <behaviors>  
      <serviceBehaviors>  
        <behavior>  
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->  
          <serviceMetadata httpsGetEnabled="true"/>  
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->  
          <serviceDebug includeExceptionDetailInFaults="false"/>  
        </behavior>  
      </serviceBehaviors>  
    </behaviors>  
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />  
  </system.serviceModel>  
  <system.webServer>  
    <modules runAllManagedModulesForAllRequests="true"/>  
  </system.webServer>  

</configuration>  

添加?返回类型后输入,然后返回空值即可