function kotlin devuelve nulo

Estoy intentando algún desarrollo de Android con kotlin. En mi caso, quiero sobrescribir: ContentProvider, donde tengo que sobrescribir la function "consulta". "consulta" devuelve el tipo "Cursor". Sin embargo, cuando creo la instancia de Cursor en la function con database.query obtengo un "Cursor?" tipo. Entonces, solo puedo devolver Cursor si no es nulo, pero ¿qué hago si es nulo?

Esto es lo que básicamente se ve:

override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor { val cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder) // make sure that potential listeners are getting notified cursor?.setNotificationUri(getContext()?.getContentResolver(), uri) if(cursor != null) return cursor else // what to do here? 

¿Alguna idea de cómo resolver eso?

Gracias, Sven

ACTUALIZACIÓN En primer lugar, gracias por las respuestas.

La anotación parece no funcionar en mi caso, ya que solo puedo acceder al código comstackdo y no tengo la opción de anotar la fuente. Tal vez me estoy perdiendo algo aquí.

Implementar mi propio cursor Parece excesivo, especialmente si tengo que hacerlo cada vez que ocurre un problema.

¡Entonces parece que mi única opción es devolver el cursor! Pero no sé exactamente cómo hacerlo. Mi código es un poco más complicado que en mi ejemplo, me perdí una statement de cuándo. Esta es una versión actualizada:

 override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor { val cursor = ??? //how to initialize cursor somehow? val db = database.getWritableDatabase() if(db != null) { val cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder) // make sure that potential listeners are getting notified cursor?.setNotificationUri(getContext()?.getContentResolver(), uri) if(cursor != null) return cursor } // return what here? cursor does not exist } 

¿Realmente tengo que implementar mi propio cursor y desorderar mi código con el inútil "throw UnsupportedExceptions"?

    Tus opciones son:

    • Si el cursor es null , lanza una exception: ¡ return cursor!! (Esto está bien en caso de que esté seguro de que el cursor nunca es realmente null
    • Si el cursor es null , devuelve un cursor trivial (por ejemplo, tu propia implementación de AbstractCursor que se comporta como un set de resultados vacío)
    • (como dijo Franck en su comentario) anote la function QueryBuilder.query() como @NotNull : http://blog.jetbrains.com/kotlin/using-external-annotations/

    Hay bibliotecas creadas alnetworkingedor de este tema:

    La biblioteca de resultados de Kotlin ofrece una buena manera de manejar su caso de "hacer esto o aquello" en function de los valores de respuesta. Y para tener una respuesta real y una exception o respuesta inválida que es lo que estás buscando.

    Para Promises, puede encontrar lo mismo en la biblioteca de Kovenant . Con las promises de Kovenant se pueden resolver de inmediato y no tienen que ser asincrónicas. Por lo tanto, funciona como una biblioteca de propósito general "Tengo un resultado, o no".

     // ... in my function that returns Promise<Cursor, String> if (good) { return Promise.ofSuccess<Cursor, String>(cursor) } else { return Promise.ofFail<Cursor, String>("no database connection") } 

    Luego, en la persona que llama de la function:

     myFuncMakingACursor() success { cursor -> //called when all is ok, and I have a cursor } fail { //called when promise is rejected } always { //no matter what result we get, this is always called once. } 

    Las promises no siempre tienen que tener errores como tipo de falla. Pueden ser lo que quieras. Un código de error, post de error, class de datos o una exception si lo desea.

    Ambas bibliotecas le dan la manera de devolver resultados alternativos de una sola function, y también para derivar el código en function de los resultados

    Estas son buenas alternativas de Kotlin a Optional y Maybe .

    También está bien usar nulos, y hay muchos operadores que ayudan a lidiar con valores nulos en estos casos. En Kotlin, ¿cuál es la forma idiomática de tratar con valores que aceptan nulos, referencerlos o convertirlos? Es otra publicación SO que cubre la nulabilidad en general, que explica algunos de los operadores disponibles (incluido el operador "llamada segura" utilizado en algunas de las respuestas).

     if (db != null){ //... } else { return null } 

    y poner tipo de retorno al Cursor?

    Así es como lo hago generalmente. No sé si es malo o bueno.

    En realidad, hay un truco que le permite engañar al comstackdor de Kotlin para que acepte null como una reference que no admite null .

    NullHack.java :

     public class NullHack { private NullHack() { } @SuppressWarnings("ConstantConditions") @NotNull public static <T> T nullHack(@Nullable T object) { return object; } } 

    NullHack.kt :

     fun <T> T?.nullHack(): T = NullHack.nullHack(this) 

    Luego, en la subclass ContentProvider puedes escribir el siguiente código:

     override fun query(uri: Uri, projection: Array<out String>?, selection: String?, selectionArgs: Array<out String>?, sortOrder: String?): Cursor { val db = database.getWritableDatabase()!! val cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder) // make sure that potential listeners are getting notified cursor?.setNotificationUri(getContext()?.getContentResolver(), uri) return cursor.nullHack() }