房间数据库查询在Kotlin中应为空安全的位置返回空
当数据库为空时,我有一个没有结果的查询。因此,NULL是正确的返回值 但是,Android Studio中的编译器给了我一个警告:房间数据库查询在Kotlin中应为空安全的位置返回空,kotlin,android-room,Kotlin,Android Room,当数据库为空时,我有一个没有结果的查询。因此,NULL是正确的返回值 但是,Android Studio中的编译器给了我一个警告:条件'maxDateTime!=“null”总是“true” 如果我调试代码,null检查将正确执行,因为值实际上为null 当我将接口重写为“fun queryMaxServerDate():String?”(注意问号)时,编译器警告消失了 但是“fun queryMaxServerDate():String”不应该导致编译错误,因为它可以为null @Dao in
条件'maxDateTime!=“null”总是“true” 如果我调试代码,null检查将正确执行,因为值实际上为null 当我将接口重写为“fun queryMaxServerDate():String?”(注意问号)时,编译器警告消失了 但是“fun queryMaxServerDate():String”不应该导致编译错误,因为它可以为null
@Dao
interface CourseDao {
// Get latest downloaded entry
@Query("SELECT MAX(${Constants.COL_SERVER_LAST_MODIFIED}) from course")
fun queryMaxServerDate(): String
}
//调用函数
/**
*@return表中的最高服务器日期(以毫秒为单位)或1为空/错误。
*/
fun queryMaxServerDateMS():长{
val maxDateTime=courseDao.queryMaxServerDate()
var timeMS:Long=0
如果(maxDateTime!=null){//警告:条件“maxDateTime!=null”始终为“true”
timeMS=TimeTools.parseDateToMillisOrZero\u UTC(maxDateTime)
}
如果(timeMS注释生成的底层代码是java,则返回空安全异常,如下所示:-
Kotlin的类型系统旨在从中消除NullPointerException
我们的准则。NPE的唯一可能原因可能是:
抛出NullPointerException()的显式调用;的用法!!
下文所述的操作员
一些数据不一致的方面
要初始化,请执行以下操作:
- 一个未初始化的文件可以在
构造函数被传递并在某处使用(“泄漏此”)
- A
超类构造函数调用其在
派生类使用未初始化状态
- Java互操作:
- 尝试访问平台类型的空引用上的成员
- 用于Java互操作的泛型类型具有不正确的nullability,
e、 g.一段Java代码可能会将null添加到Kotlin中
MutableList,意味着应该使用MutableList
与之合作
- 外部Java代码引起的其他问题
e、 g.CourseDao中的queryMaxServerDate()生成的代码大致如下:-
@Override
public String queryMaxServerDate() {
final String _sql = "SELECT max(last_mopdified) from course";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
__db.assertNotSuspendingTransaction();
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final String _result;
if(_cursor.moveToFirst()) {
final String _tmp;
_tmp = _cursor.getString(0);
_result = _tmp;
} else {
_result = null;
}
return _result;
} finally {
_cursor.close();
_statement.release();
}
}
如您所见,没有提取任何数据(没有第一行)并返回null
@Override
public String queryMaxServerDate() {
final String _sql = "SELECT max(last_mopdified) from course";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
__db.assertNotSuspendingTransaction();
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final String _result;
if(_cursor.moveToFirst()) {
final String _tmp;
_tmp = _cursor.getString(0);
_result = _tmp;
} else {
_result = null;
}
return _result;
} finally {
_cursor.close();
_statement.release();
}
}