You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:06:19