Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin输入名字和姓氏,并进行扭曲_Kotlin_Input - Fatal编程技术网

Kotlin输入名字和姓氏,并进行扭曲

Kotlin输入名字和姓氏,并进行扭曲,kotlin,input,Kotlin,Input,似乎是一个相当简单的程序,但我不知道我做错了什么。非常感谢您的帮助 任务编写一个程序,分别在一行中读取一个人的名字和姓氏。然后,用点打印名字的第一个字母,然后打印姓氏(中间只有一个空格):例如,Arthur Dent将是a.Dent 我尝试了以下代码: fun main() { val s1 = readLine() val s2 = readLine() println(s1.first() +"." + " " + s2) }

似乎是一个相当简单的程序,但我不知道我做错了什么。非常感谢您的帮助

任务编写一个程序,分别在一行中读取一个人的名字和姓氏。然后,用点打印名字的第一个字母,然后打印姓氏(中间只有一个空格):例如,Arthur Dent将是a.Dent

我尝试了以下代码:

fun main() {
    val s1 = readLine()
    val s2 = readLine()
    println(s1.first() +"." + " " + s2)
}
返回错误:
在字符串类型的可空接收器上只允许安全(?)或非空断言(!!)调用?

这在Python中非常简单,但在Kotlin中一直在努力解决它

提前谢谢

查看报告,它指出:

如果输入流被重定向到文件且已到达文件结尾,则返回read行或null行。
(如果您伪造结束文件指示,也可返回null行)

这意味着
s1
s2
都可以为空。如果您明确声明了VAL的类型(kotlin的初学者应该经常这样做),您就会看到这一点,因为它们是
String?

因此,如果我们想得到第一个字母(或者做更多或更少的事情),我们需要使用
来避免NPE。
s2
没有出现任何错误的原因是,默认调用
.toString
只会返回一个值为
null
的字符串

现在,即使您添加了安全调用,您仍然会得到一个错误,即您不能将
null
连接到
字符串
。您可以简单地通过使用模板而不是串联(这实际上是kotlin中首选的方式)来解决它。因此,我们将有:

println("${s1?.first()}. $s2")

由于单一输入要求而产生的一些变化。如果您只有一个类型为
John Doe
的输入,那么上面的代码将不起作用,因为您正在读取两个单独的行,其中一行不存在,使得lastName为空。为单个输入执行操作需要更多的工作:

val line = readLine()?.split(" ")
        
val firstNameInitial = line?.getOrNull(0)?.first()
val lastName = line?.getOrNull(1)
        
println("$firstNameInitial. $lastName")
这假设没有人的名字中有空格(不确定是否为真),没有人会输入中间名,并且名字和姓氏之间用“”空格分隔


根据的注释,我们还可以通过抛出我们自己的异常来声明输入不可读,从而使用确保readLine不为null

val line = (readLine() ?: error("Unexpected end of input, expected first and last name in format \"John Doe\"")).split(" ")
        
val firstNameInitial = line.getOrNull(0)?.first() // in case we receive an empty string
val lastName = line.getOrNull(1) //in case we only receive one name
        
println("$firstNameInitial. $lastName")
从调查结果来看,它指出:

如果输入流被重定向到文件且已到达文件结尾,则返回read行或null行。
(如果您伪造结束文件指示,也可返回null行)

这意味着
s1
s2
都可以为空。如果您明确声明了VAL的类型(kotlin的初学者应该经常这样做),您就会看到这一点,因为它们是
String?

因此,如果我们想得到第一个字母(或者做更多或更少的事情),我们需要使用
来避免NPE。
s2
没有出现任何错误的原因是,默认调用
.toString
只会返回一个值为
null
的字符串

现在,即使您添加了安全调用,您仍然会得到一个错误,即您不能将
null
连接到
字符串
。您可以简单地通过使用模板而不是串联(这实际上是kotlin中首选的方式)来解决它。因此,我们将有:

println("${s1?.first()}. $s2")

由于单一输入要求而产生的一些变化。如果您只有一个类型为
John Doe
的输入,那么上面的代码将不起作用,因为您正在读取两个单独的行,其中一行不存在,使得lastName为空。为单个输入执行操作需要更多的工作:

val line = readLine()?.split(" ")
        
val firstNameInitial = line?.getOrNull(0)?.first()
val lastName = line?.getOrNull(1)
        
println("$firstNameInitial. $lastName")
这假设没有人的名字中有空格(不确定是否为真),没有人会输入中间名,并且名字和姓氏之间用“”空格分隔


根据的注释,我们还可以通过抛出我们自己的异常来声明输入不可读,从而使用确保readLine不为null

val line = (readLine() ?: error("Unexpected end of input, expected first and last name in format \"John Doe\"")).split(" ")
        
val firstNameInitial = line.getOrNull(0)?.first() // in case we receive an empty string
val lastName = line.getOrNull(1) //in case we only receive one name
        
println("$firstNameInitial. $lastName")

嗨,亚历克斯,谢谢你解释整个情况。话虽如此,我尝试了两种代码:
println(${s1.first()}.$s2”)
这从一开始就返回该错误:
在字符串类型的可空接收器上只允许安全(?)或非空断言(!!.)调用?
根据您的建议,我添加了
并且此代码:
println(${s1?.first()}.$s2”)
返回:
测试输入:Jane Doe正确输出:J.Doe您的代码输出:J.null
哦,对不起,忘了添加我说要添加的东西,
?。
安全呼叫。。。我已经编辑了答案。至于第二部分,您需要执行Jane-enter-Doe-enter。因为您有两个单独的字段。如果你想让它们在同一个输入行中,那么你需要在代码中做更多的修改。输入是由嵌入式代码编辑器完成的,所以我无法控制它。但我想我们的方向是对的。唯一剩下的问题是为什么s2返回null?因为默认调用了
.toString
?如果是这样,您如何修复它?第二个返回null,因为它没有收到任何值。您在同一行中给出了姓名,但读了两行。我已经添加了如何用单个输入来完成。好了,我现在明白了。Alex,谢谢你的反馈和澄清!嗨,亚历克斯,谢谢你解释整个情况。话虽如此,我尝试了两种代码:
println(${s1.first()}.$s2”)
这从一开始就返回该错误:
在字符串类型的可空接收器上只允许安全(?)或非空断言(!!.)调用?
根据您的建议,我添加了
并且此代码:
println(${s1?.first()}.$s2)