【问题标题】:FormatException was unhandled (int.Parse)FormatException 未处理 (int.Parse)
【发布时间】:2014-03-07 06:31:53
【问题描述】:

我有:

    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 转换为 List 。没有编译器错误,但运行时错误“FormatException was unandled”并指向 (int.Parse)。我读过 int.Parse 如果在空字符串上使用会导致这种情况,但我不明白如果是这样的话。

【问题讨论】:

  • 异常时txtScores.Text的值是多少
  • 使用 int.TryParse。我怀疑您尝试转换的字符串不是数字格式
  • 放一些IsInt32方法的细节
  • 我注释掉了 IsInt32 并在没有验证器的情况下运行它(这就是 IsInt32,我相信你知道)。还是一样的结果。私人 bool IsInt32(){try {Convert.ToInt32(txtScore.Text);返回真; } catch (FormatException) {MessageBox.Show(txtScore.Tag + "必须是整数。"); txtScore.Focus();返回 false;}}
  • 我可以直接在 txtScores {100 20 40} 中输入我想要的格式的分数字符串,它工作得很好。我应该使用 txtScores.Text += txtScore.Text + " "; 在同一个框中输入相同的分数。它是作为字符串输入的,不是吗?

标签: c# linq parsing formatexception


【解决方案1】:

因为您要附加一个空格,所以“Split”方法会在您不期望的最后返回一个空元素,请添加 na 选项“SplitOptions.RemoveEmptyEntries”(从头开始,检查它是否是正确的名称)和您的代码将起作用。

【讨论】:

  • +1,好收获!可能必须像txtScores.Text.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries) 一样调用
【解决方案2】:

你可以像这样使用TryParse

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

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

【讨论】:

    【解决方案3】:

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

    让我们考虑下面用空格分隔的分数

    111 123 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();
    

    【讨论】:

      【解决方案4】:

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

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

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

      简而言之:您有一个很好的错误消息,并且应该能够通过使用标准调试技术快速找到此错误。

      【讨论】:

      • 这看起来更像是一条评论
      • 这不是答案。
      • 你是对的,但是还有“给一个人一条鱼,你会喂他一天(...)”。在这种情况下,通过检查结果集合很快就会发现罪魁祸首额外空间。
      猜你喜欢
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多