程序没有如期退出循环

来源:5-1 命令行计数器开发

慕运维0750787

2021-04-21 11:34:43

package chapter3
import java.lang.IllegalArgumentException
import java.lang.UnsupportedOperationException
fun main(args: Array<String>) {
while (true) {
println("请输入两个数的基本算式,以空格分隔。例如: 3 + 4")
val input = readLine()?: break
       try {
//        以空隔分割输入input,转换成数组splits
           val splits = input.trim().split(" ")//trim()去掉字符串前后的空格。这样字符串中间以空格分割
           if (splits.size < 3) {
throw IllegalArgumentException("参数个数不对")
val arg1 = splits[0].toDouble()
val op = splits[1]
val arg2 = splits[2].toDouble()
println("$arg1 $op $arg2=${Operator(op).apply(arg1, arg2)}")
println("$arg1 $op $arg2=${Operator(op).opFun(arg1, arg2)}")
}
} catch (e: NumberFormatException) {
println("你确定输入的是数字吗?数字与计算符之间请用空格隔开")
} catch (e: IllegalArgumentException)//参数非法
       {
println("您确定输入的是三个参数吗?或者确定输入数字与计算符之间用空格分隔的吗?")
} catch (e: UnsupportedOperationException) {
print("请输入正确的运算符,只支持: +  -  * / %")
} catch (e: Exception) {
println("亲爱的用户,程序遇到了未知的异常,${e.message}")
}
println("再来一发?[Y]")
val cmd = readLine()
if (cmd == null || cmd.trim().toLowerCase() != "y") {
break
       }
}
println("感谢使用我们的计算器!")
}

class Operator(op: String) {
val opFun: (left: Double, right: Double) -> Double//函数声明

   init {
//        类初始化时判断运算符,实现opFun函数Lambda表达式的初始化
       opFun = when (op) {
"+" -> { l, r -> l + r }
           "-" -> { l, r -> l - r }
           "*" -> { l, r -> l * r }
           "/" -> { l, r -> l / r }
           "%" -> { l, r -> l % r }
           else -> {
throw UnsupportedOperationException(op)
}
}
}
//    传入opFun函数的参数
   fun apply(left: Double, right: Double): Double {
return opFun(left, right)
}
}

按照这个程序,无输入即input为null​,应该直接退出循环才对。可是运行如下:

请输入两个数的基本算式,以空格分隔。例如: 3 + 4

您确定输入的是三个参数吗?或者确定输入数字与计算符之间用空格分隔的吗?
再来一发?[Y]

也就是说无输入,会捕获异常,但是

 val input = readLine()?: break

这句话是在try{} catch(){}语句前面,我的理解是直接跳出循环,不会再执行到try  ..catch..语句。

如果打断点debug,则如下图,没有输入的机会,无法查出原因:

http://img.mukewang.com/climg/607f9d5009a29dd914400900.jpg

写回答

1回答

好帮手慕雪

2021-04-22

同学,你好!

对象A ?: 对象B ,意思为,当对象 A值为 null 时,那么它就会返回后面的对象 B。但这里并不是退出循环。

所以由于

http://img.mukewang.com/climg/6080dd4b09d29f7510310705.jpg

先捕获到的异常,然后又走的下面内容了。祝:学习愉快!


0

0 学习 · 1012 问题

查看课程