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

C# while循环异常处理:遇FormatException时程序退出问题解决

解决C#猜数字程序触发FormatException后退出循环的问题

问题根源

你的代码把两次输入放在同一个try块中,触发FormatException后,catch块执行完毕会直接进入外层循环的条件判断。此时userGuess1和userGuess2大概率还是初始值0,满足userGuess1 == userGuess2,导致循环直接退出,程序结束。

优化方案1:用int.TryParse替代异常捕获(推荐)

这种方式无需try-catch,直接验证输入有效性,逻辑更简洁高效。

完整代码

static void Main(string[] args)
{
    int userGuess1 = 0;
    int userGuess2 = 0;

    Console.WriteLine("Welcome to the game. To win User 2 must guess the number User 1 inputs!");
    
    do
    {
        userGuess1 = GetValidNumber("User 1, enter a number between 1 and 10 : ");
        userGuess2 = GetValidNumber("User 2, guess a number between 1 and 10 : ");

        if (userGuess2 < userGuess1)
        {
            Console.WriteLine("Your guess is too low.");
        }
        else if (userGuess2 > userGuess1)
        {
            Console.WriteLine("Your guess is too high.");
        }
    }
    while (userGuess1 != userGuess2);

    Console.WriteLine("Congratulations! You won!");
    Console.ReadKey();
}

// 封装获取有效数字的辅助方法
static int GetValidNumber(string prompt)
{
    int number;
    do
    {
        Console.WriteLine(prompt);
    } 
    // 验证输入是否为整数,且在1-10范围内
    while (!int.TryParse(Console.ReadLine(), out number) || number < 1 || number > 10);
    return number;
}

关键说明

  • 辅助方法GetValidNumber会反复提示用户输入,直到输入符合要求(1-10的整数),彻底避免格式异常问题。
  • 欢迎语放在循环外,避免重复打印。

优化方案2:保留try-catch拆分输入逻辑

如果坚持使用异常捕获,可以将两次输入拆分为独立的循环,确保每次输入有效后再进入下一步。

完整代码

static void Main(string[] args)
{
    int userGuess1 = 0;
    int userGuess2 = 0;

    Console.WriteLine("Welcome to the game. To win User 2 must guess the number User 1 inputs!");
    
    do
    {
        // 单独处理User1的输入,直到有效
        while (true)
        {
            try
            {
                Console.WriteLine("User 1, enter a number between 1 and 10 : ");
                userGuess1 = Convert.ToInt32(Console.ReadLine());
                if (userGuess1 >= 1 && userGuess1 <= 10)
                    break;
                else
                    Console.WriteLine("Number must be between 1 and 10.");
            }
            catch (FormatException)
            {
                Console.WriteLine("Please enter a valid number.");
            }
        }

        // 单独处理User2的输入,直到有效
        while (true)
        {
            try
            {
                Console.WriteLine("User 2, guess a number between 1 and 10 : ");
                userGuess2 = Convert.ToInt32(Console.ReadLine());
                if (userGuess2 >= 1 && userGuess2 <= 10)
                    break;
                else
                    Console.WriteLine("Number must be between 1 and 10.");
            }
            catch (FormatException)
            {
                Console.WriteLine("Please enter a valid number.");
            }
        }

        if (userGuess2 < userGuess1)
        {
            Console.WriteLine("Your guess is too low.");
        }
        else if (userGuess2 > userGuess1)
        {
            Console.WriteLine("Your guess is too high.");
        }
    }
    while (userGuess1 != userGuess2);

    Console.WriteLine("Congratulations! You won!");
    Console.ReadKey();
}

关键说明

  • 每个输入都用独立的while循环包裹,触发格式异常时会重新提示输入,不会影响外层的游戏循环。
  • 额外增加了数字范围验证,确保输入符合游戏要求。

内容的提问来源于stack exchange,提问作者ZarkMuckerberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:58:39