为什么这个 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。
我有这段代码可以检查我的 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。