如何使用Kotlin安全地强制转换readLine()的结果以防止类型不匹配

7jmck4yq  于 2023-03-03  发布在  Kotlin
关注(0)|答案(3)|浏览(149)

我看过/读过的许多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代码来完成这个任务?

wydwbb8l

wydwbb8l1#

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

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

在本例中,我们读取该行(作为String?),如果它不为空,则调用toIntOrNull();如果 that 不为空,则得到答案;否则,使用0作为默认值。

ymdaylpp

ymdaylpp2#

虽然我主要是一个Swift开发人员,但这是一个非常相似的概念,在Swift中它被称为nil合并操作符,但显然在Kotlin中它被称为Elvis操作符(嗯哼)。
这些文档是here,因此代码如下所示:
var num : String = readLine() ?: "0";
如果Elvis运算符?:之前的值不为空,则使用该值,否则使用您提供的第二个默认值。

gev0vcfq

gev0vcfq3#

您还可以输入:

var str = readLine().toString();

对我有用!

相关问题