- 人机交互
- 异常处理
- Kotlin中的!!和?的使用
人机交互意味着脱离了脱离了死板的运行->产生结果->结束,让代码在运行的过程中可以进行人工的干预,将过程变为运行->交互->产生结果->结束。让程序有更多的可能性。
简单的代码示例如下:
fun main(args:Array<String>)
{
var a=readLine()
println(a)
}
实验结果:运行过程中输入你是小猪,得出结果你是小猪
你是小猪
你是小猪
此时让我们思考一个问题:如果我在运行过程中不输入数据会产生什么样的结果?让我们来试一下
实验结果:运行过程中直接回车,得出的结果 (啥也没)
真相:实际上readLine读取的是数据默认为字符串,当我们直接回车的时候,得到的是“”的字符串。
这时候我们需要用一个比较直观的例子:
fun main(args:Array<String>)
{
var a= readLine()
var b=a.toInt()
println(b)
}
这时候我的想法是输入一个数字,将其读取赋值给a,再将a转化为int类型赋值给b打印输出(直接打印a得到的数字其实是一个String类型的数据而非Int类型的数据)
表面上看起来没有什么错误,但是此时IEDA报错
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
它的意思是:a是一个不安全的数据,a有可能是一个空值,只有在a后添加?或者添加!!号后才能允许接收一个String类型的空值。
这就要引入一个概念:
使用Java稍不留神很容易导致NullPointException。Kotlin的类型系统使用可空类型(Nullable Type)旨在消除null引用导致的代码出错。Kotlin要求我们必须检测可空类型的值,只有非null的值才允许访问。以避免null引用的出现。
所以对于一个输入的数据我们可以做以下处理来避免Null引用的出现:
- 在变量名后加?
var a= readLine()
var b=a?.toInt()
那么当我们运行中输入了?后 该问题解决
"?"加在变量名后,系统在任何情况不会报它的空指针异常
- 还有一种情况是在变量名后加 !!
var a= readLine()
var b=a!!.toInt()
在这种情况下
"!!"加在变量名后,如果对象为null,那么系统一定会报异常!
上述两种方式都能很好的避免空值的出现引起的空指针异常现象。
好了继续我们的例子,让我们做一个简单的加法来进行实验:
fun main(args:Array<String>)
{
println("请输入第一个数字:")
var a= readLine()
var b=a!!.toInt()
println("请输入第二个数字:")
var c= readLine()
var d=c!!.toInt()
println("${b}+${d}=${b+d}")
}
这个例子可以进行简单的加法运算
如果我们按照正常规则来:
请输入第一个数字:
1
请输入第二个数字:
3
1+3=4
那么我们可以得出正确答案
但是如果我们此时异想天开脑洞大开做了些匪夷所思的事儿:
比如我们想输入小王+小张 得到结果❤
抱歉,不可以
这只会产生一个后果:
Exception in thread "main" java.lang.NumberFormatException: For input string: "小王"
那么 我们该如何去规避由于输入异常导致的问题呢:
这时候引入了异常处理机制也就是Java中的try{}catch(){}
import java.lang.Exception
fun main(args:Array<String>)
{
while (true) {
try {
println("请输入第一个数字:")
var a = readLine()
var b = a!!.toInt()
println("请输入第二个数字:")
var c = readLine()
var d = c!!.toInt()
println("${b}+${d}=${b + d}")
break
} catch (e: Exception) {
println("键入错误!请输入数字")
}
}
}
结果如下:
请输入第一个数字:
小王
键入错误!请输入数字
请输入第一个数字:
1
请输入第二个数字:
3
1+3=4
此时如果我们输入的是错误的数据类型则会有相信的提示,不会由于错误导致程序中断运行。