C#运行报Unhandled Exception未处理异常的原因排查
报错根因
这个报错不是代码语法编写错误,也不是C#本身不支持多输入处理,问题出在你使用的移动端C#编译器的控制台交互实现有缺陷。
- 异常触发逻辑:报错显示
int.Parse()接收到的入参是null,才抛出ArgumentNullException。正常用户手动输入空行的话,Console.ReadLine()会返回空字符串,int.Parse会抛出格式异常而非空参数异常,只有当Console.ReadLine()直接返回null时才会触发这个错误。 Console.ReadLine()返回null的触发条件:按照.NET的运行规则,只有当输入流结束、没有更多可读取的内容时,这个方法才会返回null。标准桌面端控制台运行这段代码时,会在每一次调用ReadLine()时阻塞,等待用户输入完按回车之后再往下执行,不会提前返回null。但大部分轻量移动端C#在线编译器并没有实现完整的交互式控制台能力,很多只支持程序启动前一次性传入全部输入内容,不会在运行过程中阻塞等待用户二次输入,当第一次ReadLine把预传入的内容读完后,第二次调用时输入流已经结束,就直接返回null触发异常。
解决办法
- 临时适配当前编译器:尝试在程序启动前,就把两个要计算的整数按换行分隔一次性填到输入框里,再启动运行,比如预先输入:
10 25
很多移动端编译器会把预填的内容作为完整输入流传给程序,这种情况下两次ReadLine就能分别读到两个值,不会返回null。
- 优化代码鲁棒性:增加空值和输入格式校验,避免直接把
ReadLine的返回值传入int.Parse,修改后的参考代码:
using System; namespace HelloWorld { public class Program { public static void Main(string[] args) { int a, b, c; Console.WriteLine("give a:"); string aInput = Console.ReadLine(); // 循环直到拿到合法的a输入 while (!int.TryParse(aInput, out a)) { if (aInput == null) { Console.WriteLine("当前运行环境不支持多轮交互输入,请更换支持标准控制台的C#运行环境"); return; } Console.WriteLine("输入无效,请重新输入整数a:"); aInput = Console.ReadLine(); } Console.WriteLine("give b:"); string bInput = Console.ReadLine(); // 循环直到拿到合法的b输入 while (!int.TryParse(bInput, out b)) { if (bInput == null) { Console.WriteLine("当前运行环境不支持多轮交互输入,请更换支持标准控制台的C#运行环境"); return; } Console.WriteLine("输入无效,请重新输入整数b:"); bInput = Console.ReadLine(); } c = a + b; Console.WriteLine("c={0}", c); } } }
- 如果预填输入、加了校验之后依然在第二次读取时返回null,说明你当前用的移动端编译器完全不支持多轮控制台交互,换一个实现完整控制台能力的C#运行环境即可,原代码本身的逻辑在标准.NET控制台环境下是可以正常运行的。
内容的提问来源于stack exchange,提问作者Elie Makdissi
相关产品推荐
相关产品推荐

