C#代码触发System.FormatException且无法获取Total值求助
解决System.FormatException异常与Total值无法获取的问题
嘿,我来帮你搞定这个问题!咱们一步步来分析和解决:
异常原因
你遇到的System.FormatException是因为int.Parse()这个方法非常“挑剔”——它要求输入的字符串必须是严格的有效整数格式。如果txtMaths.Text里是空的、包含字母/空格/特殊符号,或者数值超出了int类型的范围(比如大于2147483647或小于-2147483648),这个方法就会直接抛出异常,导致程序中断,后面计算Total的代码根本没机会运行,所以你拿不到Total值。
解决方案:用int.TryParse替代int.Parse
int.TryParse()是更安全的转换方法,它不会抛出异常,而是返回一个布尔值告诉你转换是否成功,同时通过out参数输出转换后的整数。这样既能避免程序崩溃,还能给用户友好的错误提示。
修改后的代码示例:
// 变量名改用小驼峰,符合C#编码规范 int sinhala, maths, science, history, buddhism, english, group1, group2, group3, total, average; private void btnCalculate_Click(object sender, EventArgs e) { // 先初始化所有分数为0,避免未赋值的问题 sinhala = 0; maths = 0; science = 0; history = 0; buddhism = 0; english = 0; group1 = 0; group2 = 0; group3 = 0; // 逐个验证并转换每个文本框的输入 if (!int.TryParse(txtSinhala.Text, out sinhala)) { MessageBox.Show("请输入有效的僧伽罗语分数!"); txtSinhala.Focus(); // 让光标回到错误的输入框 return; // 终止后续代码执行 } if (!int.TryParse(txtMaths.Text, out maths)) { MessageBox.Show("请输入有效的数学分数!"); txtMaths.Focus(); return; } if (!int.TryParse(txtScience.Text, out science)) { MessageBox.Show("请输入有效的科学分数!"); txtScience.Focus(); return; } if (!int.TryParse(txtHistory.Text, out history)) { MessageBox.Show("请输入有效的历史分数!"); txtHistory.Focus(); return; } if (!int.TryParse(txtBuddhism.Text, out buddhism)) { MessageBox.Show("请输入有效的佛学分数!"); txtBuddhism.Focus(); return; } if (!int.TryParse(txtEnglish.Text, out english)) { MessageBox.Show("请输入有效的英语分数!"); txtEnglish.Focus(); return; } if (!int.TryParse(txtGroup1.Text, out group1)) { MessageBox.Show("请输入有效的Group1分数!"); txtGroup1.Focus(); return; } if (!int.TryParse(txtGroup2.Text, out group2)) { MessageBox.Show("请输入有效的Group2分数!"); txtGroup2.Focus(); return; } if (!int.TryParse(txtGroup3.Text, out group3)) { MessageBox.Show("请输入有效的Group3分数!"); txtGroup3.Focus(); return; } // 所有输入都有效,计算总分 total = sinhala + maths + science + history + buddhism + english + group1 + group2 + group3; txtTotal.Text = total.ToString(); // 如果需要计算平均分,可以在这里补充 // average = total / 9; // 注意整数除法会舍去小数,若需要精确值可改用double类型 }
额外优化建议
- 限制文本框输入:可以给每个分数文本框添加
KeyPress事件,只允许输入数字和退格键,从源头减少无效输入:private void txtMaths_KeyPress(object sender, KeyPressEventArgs e) { // 只允许数字和退格键 if (!char.IsDigit(e.KeyChar) && e.KeyChar != '\b') { e.Handled = true; } } - 空值处理:
int.TryParse会把空字符串判定为转换失败,所以上面的代码已经覆盖了空输入的情况,不用额外判断。 - 变量初始化:提前给所有分数变量赋值0,避免出现“使用未赋值的局部变量”的编译错误。
这样修改后,不仅能解决FormatException的问题,Total值也能正常计算并显示在txtTotal里啦!
内容的提问来源于stack exchange,提问作者Chamika Lakshaan
相关产品推荐
相关产品推荐

