Kotlin编写简易计算器时readLine()相关减乘除运算报错求解
Kotlin 计算器 readLine 输入运算报错排查
核心报错原因
你的代码触发减/乘/除运算报错、加法逻辑异常的根源是类型不匹配:
readLine()方法的返回值是可空字符串类型String?,你读取到choosen、num1、num2三个变量后,没有将字符串转为数值类型就直接执行运算- Kotlin中
+运算符支持字符串拼接,所以加法分支不会报语法错误,但实际执行的是字符串拼接而非数值相加:比如输入数字1和2,加法分支会输出拼接结果12,不是正确的计算结果3 - 减、乘、除三个运算符没有字符串类型的重载实现,直接对字符串类型调用
-/*//会直接触发编译/运行时错误 - 额外隐患:直接调用
toInt()转换时,如果用户输入非数字内容、或者输入流异常返回null,会触发数字格式异常、空指针异常导致程序崩溃
修正后可运行代码
fun main() { print("1. Addition\n2. Subtraction\n3. Multiplication\n4. Division\nChoose Number: ") // 读取操作选项,输入非合法数字时兜底为-1走错误提示分支 val choosen = readLine()?.toIntOrNull() ?: -1 print("Enter The First Number: ") // 读取第一个运算数,支持小数输入,非法输入兜底为0 val num1 = readLine()?.toDoubleOrNull() ?: 0.0 print("Enter The Second Number: ") // 读取第二个运算数 val num2 = readLine()?.toDoubleOrNull() ?: 0.0 val result = when(choosen) { 1 -> num1 + num2 2 -> num1 - num2 3 -> num1 * num2 4 -> { // 额外处理除零异常 if (num2 == 0.0) { print("Error: Cannot divide by zero") return } num1 / num2 } else -> { print("Wrong Input") return } } print("The Result Is: $result") }
修正点说明
- 用
toIntOrNull()/toDoubleOrNull()替代强制toInt()转换,输入非数字内容时不会直接崩溃,走预设的兜底逻辑 - 所有运算基于数值类型执行,修正了原加法分支字符串拼接的逻辑错误
- 采用
val修饰赋值后不再修改的变量,符合Kotlin只读变量优先的编码规范 - 用
when表达式替代多层else if判断,分支逻辑更清晰易维护 - 新增除零判断逻辑,避免除法运算时除以0触发运行时异常
- 采用
Double类型接收运算数,支持小数计算,比仅支持整数的Int类型适用性更广
内容的提问来源于stack exchange,提问作者Ibrahim Al-kaladi
相关产品推荐
相关产品推荐

