【问题标题】:How to safely cast the result of readLine() to prevent a Type Mismatch using Kotlin如何使用 Kotlin 安全地转换 readLine() 的结果以防止类型不匹配
【发布时间】:2020-01-07 07:23:56
【问题描述】:

我看过/阅读的许多 Kotlin 教程都有这行代码:

var number = Integer.valueOf(readLine())

虽然它以前明显有效,但现在在使用 Android Studio 和 Kotlin 版本 1.3.50 时会引发编译器错误。 它表示类型不匹配,其中找到的是String?,需要的是String

当然,我理解为什么会发生这种情况,我知道用户可以通过控制台传递 null 或空值,因此它需要有可选的 null 声明,但我想了解如何修复编译器错误并保留类似的代码而不进行太多更改。

虽然我可以使用这两行代码:

var number = Integer.valueOf(readLine()!!)

var number = Integer.valueOf(readLine() as String)

我相信这些可以抛出不同的异常,如here所述

我知道我可以使用以下代码“修复”这个问题:

var number : String? = readLine();
if(number == null){
    number = "0"
}
val number2 = Integer.valueOf(number);

但它似乎非常低效。使用本机 Kotlin 代码是否有更短的方法来执行此操作?

【问题讨论】:

  • 使用 Elvis 运算符指定结果为空时的默认值。 readLine()?: “0”.

标签: android-studio kotlin type-mismatch


【解决方案1】:

如果我们简单地对来自readLine() 的结果调用toInt(),如果提供的值不是实际的整数,我们将得到一个异常。为了避免异常,我们可以使用 Kotlin 标准库中的toIntOrNull()

val x= readLine()?.toIntOrNull() ?: 0

在这种情况下,我们读取该行(作为String?),如果它不为空,则在其上调用toIntOrNull()。如果 that 不为空,我们就有了答案。否则,我们使用0 作为默认值。

【讨论】:

    【解决方案2】:

    尽管我主要是一名 Swift 开发人员,但这是一个非常相似的概念。在 Swift 中它被称为 nil-coalescing 运算符,但显然在 Kotlin 中它被称为 Elvis 运算符(嗯)。

    文档是 here 所以你的代码看起来像这样:

    var num : String = readLine() ?: "0";

    如果 Elvis 运算符 ?: 之前的值不为 null,则使用该值,否则使用您提供的第二个默认值。

    【讨论】:

    • 这个答案是有效的,所以我可以使用我提到的existing 示例代码,所以+1,但我会将另一个答案标记为正确,因为它也缩短了所需的代码,也是。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多