Visual Studio 2017 Try/catch块触发局部变量未赋值错误求助
问题根因
你声明的TotalAdults、TotalStudents、TotalChildren三个局部变量,仅在int.Parse执行成功时会被赋值,一旦任意一个输入解析失败进入对应catch块,该变量就没有被赋过任何值。C#语法要求读取局部变量前必须保证它在所有执行路径下都有赋值,因此编译时直接抛出未赋值局部变量错误。
另外你当前的逻辑还有隐藏问题:哪怕某个输入解析失败弹出了错误提示,代码还是会继续执行后续的计算逻辑,不符合校验失败就终止操作的预期。
修复方案
推荐直接用int.TryParse替换多层嵌套的try/catch,写法更简洁,也能同时解决校验和变量赋值问题,修改后的参考代码如下:
// 票种常量定义,你原代码如果已经有这部分可以直接忽略 const decimal ADULT_TICKET_PRICE = 30m; const decimal STUDENT_TICKET_PRICE = 15m; const decimal CHILD_TICKET_PRICE = 10m; private void CalculateButton_Click(object sender, EventArgs e) { int totalAdults = 0, totalStudents = 0, totalChildren = 0; bool inputValid = true; // 逐个校验输入 if (!int.TryParse(AdultTextBox.Text, out totalAdults)) { MessageBox.Show("请输入成人票数量的有效数字", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error); inputValid = false; } else if (!int.TryParse(StudentTextBox.Text, out totalStudents)) { MessageBox.Show("请输入学生票数量的有效数字", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error); inputValid = false; } else if (!int.TryParse(ChildTextBox.Text, out totalChildren)) { MessageBox.Show("请输入儿童票数量的有效数字", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error); inputValid = false; } // 所有输入校验通过才执行计算 if (inputValid) { int totalTicketsSold = totalAdults + totalStudents + totalChildren; decimal totalReceipts = totalAdults * ADULT_TICKET_PRICE + totalStudents * STUDENT_TICKET_PRICE + totalChildren * CHILD_TICKET_PRICE; CashierNameOutputLabel.Text = CashierNameTextBox.Text; CashierTotalTicketsSoldOutputLabel.Text = totalTicketsSold.ToString("n"); CashierTotalReceiptsOutputLabel.Text = totalReceipts.ToString("c"); } }
如果一定要保留你原来的try/catch写法,只需要在每个catch块弹出提示后加return;提前终止方法执行即可,比如:
try { TotalAdults = int.Parse(AdultTextBox.Text); } catch { MessageBox.Show("请输入成人票数量的有效数字", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error); // 校验失败直接返回,不执行后续代码 return; }
这样就能保证只要代码走到后续计算逻辑,三个变量一定都被成功赋值,不会再报未赋值错误。
内容的提问来源于stack exchange,提问作者BNM
相关产品推荐
相关产品推荐

