为什么这个 Kotlin 条件总是标记为 'true'?

Why is this Kotlin condition marked as always 'true'?

我有这段代码可以检查我的 mongoDB 连接是否仍然有效:

val isConnected: Boolean
            get() = if (instance!!.connection != null) {
                try {
                    instance!!.connection!!.getDatabase(instance!!.databaseName!!) != null
                } catch (e: Exception) {
                    Logger.handle("Error verifying mongoDB connection status", e)
                    false
                }
            } else false

我收到警告说此条件始终为真:

Condition 'instance!!.connection!!.getDatabase(instance!!.databaseName!!) != null' is always 'true'

我知道 Kotlin 有可为 null 的类型,但 getDatabase() 方法引用了 MongoClient 中的 Java 方法。据我所知,我正在使用 jdk-8u291,它没有 Java 的可空 return 类型(不包括 @Nullable 注释)。这是反编译的 MongoClient::getDatabase() 方法:

public interface MongoClient extends Closeable {

    
    /**
     * Gets a {@link MongoDatabase} instance for the given database name.
     *
     * @param databaseName the name of the database to retrieve
     * @return a {@code MongoDatabase} representing the specified database
     * @throws IllegalArgumentException if databaseName is invalid
     * @see MongoNamespace#checkDatabaseNameValidity(String)
     */
    MongoDatabase getDatabase(String databaseName);

   // ...
}

如果 Java 方法的 return 类型显然可以为空,为什么此条件始终标记为“真”?

这是因为您正在使用 !! 运算符并且它 returns 不为空的所有内容。如果要检查某些内容是否为空,则必须使用 ? 运算符:

instance?.connection != null

!! 运算符检查是否为空,如果为空则抛出。因此,如果您在该运算符之后使用实例,它将不再为空。

您还可以使用 let 函数,例如:

val isConnected: Boolean
    get() = instance?.let {
            try {
                it.connection?.getDatabase(it.databasename) != null
            }  catch (e: Exception) {
                Logger.handle("Error verifying mongoDB connection status", e)
                false
            }
        } ?: false

是因为MongoDatabase getDatabase(String databaseName);没有标上@Nullable。因此该类型对于 Kotlin 不可为 nulable。

并且由于您说的是所有内容都不可为空 !! 那么结果不会被您未使用的 shorthand ? 返回 null。