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
相关产品推荐
相关产品推荐

