繁体   English   中英

未处理FormatException(int.Parse)

[英]FormatException was unhandled (int.Parse)

我有:

    private void btnAddScore_Click(object sender, EventArgs e)
    {
        if (IsInt32())     
        {
            txtScores.Text += txtScore.Text + " ";
            txtScore.Text = "";
        }
    }

和:

    private void button2_Click(object sender, EventArgs e)
    {
        if (IsValidData())
        {
            List<string> result = txtScores.Text.Split(' ').ToList();
            student = new Student(txtName.Text, result.Select(int.Parse).ToList());
            this.Close();
        }

    }

我正在尝试使用btnAddScore构建从txtScore到txtScores的分数字符串。 我相信这是对的。 然后,通过使用“”解析每个元素,将该字符串转换为列表。 然后,我进一步将List <string>转换为List <int>。 没有编译器错误,但是运行时错误为“ FormatException被取消”并指向(int.Parse)。 我已经读过int.Parse如果在空字符串上使用会导致这种情况,但是我不知道这种情况如何。

因为要添加空格,所以“ Split”方法将在不期望的末尾返回一个空元素,因此请添加一个选项“ SplitOptions.RemoveEmptyEntries”(从头开始,检查其名称是否正确),然后代码即可正常工作。

您可以这样使用TryParse

student = new Student(txtName.Text, result.Select(s =>
    {
        int res = 0;
        return int.TryParse(s, out res) ? res : 0;
    }).ToList());

此代码将避免您遇到的异常,如果无法解析任何值,它将设置为0

问题是您的字符串之一在用空格('')分割后无效int。 我建议仅考虑那些是有效数字的分数。

让我们考虑以下分数,以空格分隔

111123 12x 212 1454

这里的12x无效,因此您应该拒绝此号码。 并仅获得四个有效数字,如下面的代码示例所示:

var scores = "111 123 12x 212 1454";
var regex = new Regex("^[0-9]*$");
var studentScore = scores.Split(' ').Where(a => regex.IsMatch(a)).ToList();

通过在以下行中的Visual Studio中设置断点,可以轻松调试此错误:

student = new Student(txtName.Text, result.Select(int.Parse).ToList())

...然后手动检查result列表。 字符串之一绝对不是可解析的int。

简而言之:您将收到一条不错的错误消息,并且应该能够使用标准的调试技术快速找到此错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM