ArgumentOutOfRangeException:startIndex不能超过字符串的长度

时间:2016-12-13 16:34:39

标签: c#

当我运行编译器时会抛出异常:

  

ArgumentOutOfRangeException:startIndex不能长于   字符串的长度。

我不明白为什么,我写入编译器的字符串由10个数字组成,我希望substring选择第9个数字,但显然我做错了。

字符串示例:9303140456

代码:

public string kollaKön()
{
    string siffraAsString = form.textBox3.Text.Substring(8, 1);
    int siffraAsNum = int.Parse(siffraAsString);
    int result = (siffraAsNum % 2);

    if (result == 1)
    {
        return form.textBox5.Text = ("Är en Man");
    }
    else
    {
        return form.textBox5.Text = (" Är en Kvinna");
    }
}

完整的代码,可能会让我的错误显而易见:

namespace WindowsFormsApplication3
{
    public class Person
    {
        Form1 form = new Form1();
        string förnamn;
        string efternamn;
        string personnummer;
        string Kön;

        public Person(string förNamn, string efterNamn, string personNummer)
        {
            string förnamn = förNamn;
            string efternamn = efterNamn;
            string personnummer = personNummer;
        }

        static bool luhn(string personNummer)
        {
            int sum = 0;

            for (int i = 0; i < personNummer.Length; i++)
            {
                int temp = (personNummer[i] - '0') << (1 - (i & 1));
                if (temp > 9) temp -= 9;
                sum += temp;
            }
            return (sum % 10) == 0;
        }

        public string kollaKön()
        { 
            string debuggerIsMyFriend = form.textBox3.Text;
            string siffraAsString = form.textBox3.Text.Substring(8, 1);

            int siffraAsNum = int.Parse(siffraAsString);
            int result = (siffraAsNum % 2);

            if (result == 1)
            {
                return form.textBox5.Text = ("Är en Man");
            }
            else
            {
                return form.textBox5.Text = (" Är en Kvinna");
            }
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            string förnamn = textBox1.Text;
            string efternamn = textBox2.Text;
            string personnummer = textBox3.Text;
            string persnr = "";

            if (personnummer.Length != 10)
            {
                persnr = " Personnummer är i fel format. ";
            }
            if (personnummer.Length == 10)
            {
                persnr = " Personnummers är i korrekt format.";
            }

            Person p1 = new Person(förnamn, efternamn, personnummer);
            p1.kollaKön();
            textBox4.Text = förnamn + " " + efternamn + " " + personnummer + " " + " " + persnr;
        }
    }
}

4 个答案:

答案 0 :(得分:1)

在您的所有代码之前,添加此行

string debuggerIsMyFriend = form.textBox3.Text;

在该行上设置断点,运行代码并将鼠标悬停在变量上以查看它实际包含的内容,我打赌它不是您期望的10个字符串

答案 1 :(得分:1)

Person类中的这一行

Form1 form = new Form1();

声明并初始化Form1的新实例。此实例不是您在显示器上显示的实例。键入字符串时,可以在监视器上显示的实例上键入它们,而不是在此隐藏实例的文本框中键入它们。

当然这意味着你写的时候

string siffraAsString = form.textBox3.Text.Substring(8, 1);

您正在使用隐藏文本框的文本为空,并且以下子字符串代码因索引超出范围异常而失败

您需要更改Person类并添加接收计算所需文本框内容的属性。

例如

public class Person
{
    // Sorry but I have no idea of what Siffra means... 
    // change the name as you wish
    public string Siffra {get;set;}
    ...... other properties

    public string kollaKön()
    {
        // A defensive attitude is always a good practice.
        if(string.IsNullOrEmpty(this.Siffra) ||
           this.Siffra.Length < 10)
           return "Invalid Siffra";

        string siffraAsString = this.Siffra.Substring(8, 1);
        int siffraAsNum = int.Parse(siffraAsString);
        int result = (siffraAsNum % 2);
        return (result == 1 ? "Är en Man" : " Är en Kvinna");
    }
}

并在按钮中单击您运行的表单

.....
Person p1 = new Person(förnamn, efternamn, personnummer);
p1.Siffra = this.textBox3.Text;
string result = p1.kollaKön();
this.textBox5.Text = result;

答案 2 :(得分:0)

我非常确定您的专线string siffraAsString = form.textBox3.Text.Substring(8, 1);没有10个号码。

按照Jacopo的说法检查form.textBox3.Text的值。

答案 3 :(得分:0)

你应该更优雅地处理这个问题。这将正确处理您的边缘情况。

你在TextBox中获得的字符串肯定不是9个字符长或更长,除非你100%确定你的输入是9个字符,你应该优雅地处理它。

经验法则:不要先检查数组的索引而不先检查它的长度。

...第二条经验法则:如果您认为有些东西可疑,请确保您正在访问正确的UI控件。

public string kollaKön()
{
    //string siffraAsString = form.textBox3.Text.Substring(8, 1);
    int siffraAsNum = GetNinthNumber(form.textBox3.Text);
    int result = (siffraAsNum % 2);

    if (result == 1)
    {
        return form.textBox5.Text = ("Är en Man");
    }
    else
    {
        return form.textBox5.Text = (" Är en Kvinna");
    }
}

public static int GetNinthNumber(string str)
{
    string numberField = str.Trim();

    if (numberField.Length < 9)
    {
        // Handle less than 9 cases
        return 0;
    }
    else
    {
        int number;
        bool isNumber = Int32.TryParse(str[8].ToString(), out number);

        if (!isNumber)
        {
            throw new Exception("Value is not a number");
        }

        return number;
    }
}