程序没有如期退出循环
来源: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,则如下图,没有输入的机会,无法查出原因:
1回答
同学,你好!
对象A ?: 对象B ,意思为,当对象 A值为 null 时,那么它就会返回后面的对象 B。但这里并不是退出循环。所以由于
先捕获到的异常,然后又走的下面内容了。祝:学习愉快!
相似问题