我编写了一个执行数据库查询的函数。如果它无法获取任何结果,我希望它返回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
。
有谁能告诉我怎么解决这个问题?
答案 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 NullPointerException
在null
上调用时。
您的代码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>
添加?返回类型后输入,然后返回空值即可