为什么我的表单应用程序给我格式异常是未处理的警告

时间:2012-05-06 21:22:28

标签: c# exception

你好,我是这个网站的新手,所以如果我没有正确解释,我很抱歉:

我正在创建一个C#Form应用程序,我的应用程序没有错误,但是一旦我清除输入字段,就会给我一个FormatException unhandeld。

这是此功能的唯一适用代码:

    private void txtR_TextChanged(object sender, EventArgs e)
    {

        R = Convert.ToInt32(txtR.Text);
        E2 = Convert.ToInt32(txtE2.Text);
        E = R * E2;
        txtE.Text = E.ToString();

        R = Convert.ToInt32(txtR.Text);
        D2 = Convert.ToInt32(txtD2.Text);
        D = R * D2;
        txtD.Text = D.ToString();

        R = Convert.ToInt32(txtR.Text);
        P2 = Convert.ToInt32(txtP2.Text);
        P = R * P2;
        txtP.Text = P.ToString();
     }

4 个答案:

答案 0 :(得分:2)

函数Convert.ToInt32()无法处理零长度字符串,因此您不能将txtR(或任何其他文本字段)留空。

此外,我建议您考虑不在onTextChanged事件中运行此代码。常见的情况可能是您删除txtR的内容,从而触发onTextChanged并抛出异常。

在任何情况下,为了使您的代码能够防弹,最好使用Int32.TryParse()来确保转换能够正常工作,正如sharp12345建议的那样。


Convert.ToInt32()文档:MSDN link。阅读FormatException位。

答案 1 :(得分:1)

清除字段时出现错误的原因是因为您尝试将空字符串转换为数字。清除该字段时,txtR等于String.Empty,因此无法将其转换为数字。当它是空的时候:

R = Convert.ToInt32(txtR.Text);

几乎与:

相同
R = Convert.ToInt32("");

它无法做到。要解决此问题,首先需要检查所有字段是否都有值:

    private void txtR_TextChanged(object sender, EventArgs e)
{
    if(txtR.Text.Trim().Length != 0 
    && txtE2.Text.Trim().Length != 0 
    && txtD2.Text.Trim().Length != 0 
    && txtP2.Text.Trim().Length != 0)
    {

        R = float.Parse(txtR.Text);
        E2 = float.Parse(txtE2.Text);
        E = R * E2;
        txtE.Text = E.ToString();

        R = float.Parse(txtR.Text);
        D2 = float.Parse(txtD2.Text);
        D = R * D2;
        txtD.Text = D.ToString();

        R = float.Parse(txtR.Text);
        P2 = float.Parse(txtP2.Text);
        P = R * P2;
        txtP.Text = P.ToString();

    }
    else{
        MessageBox.Show("One or more of the fields were empty!");
    {
 }

希望这有帮助!

答案 2 :(得分:1)

您应该使用int.TryParse()来检查输入的值是否正确,而不是空或字符串。

所以,这段代码:

R = Convert.ToInt32(txtR.Text);
E2 = Convert.ToInt32(txtE2.Text);
E = R * E2;
txtE.Text = E.ToString();

应转换为:

if (int.TryParse(txtR.Text, out R) && int.TryParse(txtE2.Text, out E2)) {        
    E = R * E2;
    txtE.Text = E.ToString();
}

同样适用于float就像int。

答案 3 :(得分:0)

在以数字值转换用户输入字符串时使用Single.TryParse(在您的情况下浮动,而不是整数)。
通常,您无法轻易阻止用户插入一些虚假值,您的代码将失败 相反,TryParse允许您在输入无效的情况下毫无例外地测试输入字符串

    // Try to convert the R value just one time, everything fails if this fails
    if(!Single.TryParse(txtR.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out R))
        return; 
    if(Single.TryParse(txtE2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out E2)) 
    {
        E = R * E2; 
        txtE.Text = E.ToString(); 
    }

    if(Single.TryParse(txtD2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out D2))
    {
        D = R * D2; 
        txtD.Text = D.ToString(); 
    }

    if(Single.TryParse(txtP2.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out P2))
    {
        P = R * P2; 
        txtP.Text = P.ToString(); 
    }
MSDN上的

See here作为参考