C#如何处理用户非数字输入异常 附计算器代码优化建议
C# 入门计算器代码优化方案
以下是你提供的原始实现代码:
Console.Title = "My Epic Calculator !"; var numOne = ""; var numTwo = ""; var term = ""; var answer = 0; Console.WriteLine("Hello there, welcome to my calculator !\nIt can calculate everything. Come on, try it !"); Console.WriteLine("Enter your first number below."); numOne = Console.ReadLine(); if (numOne == "") { Console.WriteLine("Please enter a valud number"); } int firstTerm = int.Parse(numOne); Console.WriteLine("Now enter your second number."); numTwo = Console.ReadLine(); int secondTerm = int.Parse(numTwo); Console.WriteLine("Choose your mathematical option: x, /, + and -"); term = Console.ReadLine(); if (term == "x") { answer = firstTerm * secondTerm; } else if (term == "/") { answer = firstTerm / secondTerm; } else if (term == "+") { answer = firstTerm + secondTerm; } else if (term == "-") { answer = firstTerm - secondTerm; } Console.WriteLine($"And your answer is {answer}, see it's pretty cool huh!"); Console.ReadKey();
问题1:数字输入异常校验实现
你当前用int.Parse()做类型转换的问题在于,只要输入不是合法整数格式(包括空字符串、文字、特殊符号、超出int范围的数字),就会直接抛出运行时异常。
不需要写复杂的try-catch异常捕获逻辑,C# 内置的int.TryParse()就是专门为输入校验场景设计的:
- 转换成功时返回
true,转换结果赋值给out参数 - 转换失败时直接返回
false,不会抛出异常中断程序
搭配while循环可以实现「输入不合法就持续提示重输」的效果,你原来单独写的空输入判断也可以完全被覆盖,不需要额外编写。
额外注意除法场景要补充除数不为0的校验,否则会触发除零异常。
参考输入校验实现:
int firstTerm; Console.WriteLine("Enter your first number below."); // 输入不合法就一直循环等待正确输入 while (!int.TryParse(Console.ReadLine(), out firstTerm)) { Console.WriteLine("Invalid input, please enter a valid integer:"); }
问题2:多分支运算符判断优化
堆叠if-else在分支少的时候可以正常运行,但是分支变多后可读性差、后续加新运算符(比如取余、幂运算)的时候维护麻烦。
可以直接用C#的switch分支替换if-else判断,结构更清晰,同时可以顺便加上非法运算符的校验逻辑,避免用户输入非指定运算符时得到错误结果。
参考分支逻辑实现:
int answer; Console.WriteLine("Choose your mathematical option: x, /, + and -"); while (true) { term = Console.ReadLine().Trim(); switch (term) { case "x": answer = firstTerm * secondTerm; break; case "/": if (secondTerm == 0) { Console.WriteLine("Divisor cannot be 0, please re-enter the operator:"); continue; } answer = firstTerm / secondTerm; break; case "+": answer = firstTerm + secondTerm; break; case "-": answer = firstTerm - secondTerm; break; default: Console.WriteLine("Invalid operator, please choose from x, /, +, -:"); continue; } break; }
如果使用C# 8及以上版本,还可以写更简洁的switch表达式写法,你可以保持独立探索的习惯自行尝试调整。
优化后完整代码参考
你可以对照自己的思路调整,不需要完全照搬:
Console.Title = "My Epic Calculator !"; int firstTerm; int secondTerm; string term; int answer; Console.WriteLine("Hello there, welcome to my calculator !\nIt can calculate everything. Come on, try it !"); // 第一个数输入校验 Console.WriteLine("Enter your first number below."); while (!int.TryParse(Console.ReadLine(), out firstTerm)) { Console.WriteLine("Invalid input, please enter a valid integer:"); } // 第二个数输入校验 Console.WriteLine("Now enter your second number."); while (!int.TryParse(Console.ReadLine(), out secondTerm)) { Console.WriteLine("Invalid input, please enter a valid integer:"); } // 运算符选择+计算 Console.WriteLine("Choose your mathematical option: x, /, + and -"); while (true) { term = Console.ReadLine().Trim(); switch (term) { case "x": answer = firstTerm * secondTerm; break; case "/": if (secondTerm == 0) { Console.WriteLine("Divisor cannot be 0, please re-enter the operator:"); continue; } answer = firstTerm / secondTerm; break; case "+": answer = firstTerm + secondTerm; break; case "-": answer = firstTerm - secondTerm; break; default: Console.WriteLine("Invalid operator, please choose from x, /, +, -:"); continue; } break; } Console.WriteLine($"And your answer is {answer}, see it's pretty cool huh!"); Console.ReadKey();
内容的提问来源于stack exchange,提问作者AARAEN
相关产品推荐
相关产品推荐

