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

C# ArgumentOutOfRangeException:startIndex的长度不能超过字符串的长度,c#,C#,当我运行编译器时,它会抛出一个异常: ArgumentOutOfRangeException:startIndex的长度不能超过 绳子的长度 我不明白为什么,我在编译器中写入的字符串由10个数字组成,我希望子字符串选择第9个数字,但显然我做错了什么 字符串示例:9303140456 代码: public string kollaKön() { string siffraAsString = form.textBox3.Text.Substring(8, 1); int siffr

当我运行编译器时,它会抛出一个异常:

ArgumentOutOfRangeException:startIndex的长度不能超过 绳子的长度

我不明白为什么,我在编译器中写入的字符串由10个数字组成,我希望
子字符串
选择第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;
        }
    }
}
命名空间窗口窗体应用程序3
{
公共阶层人士
{
Form1 form=新Form1();
弦förnamn;
字符串efternamn;
弦乐演奏者;
弦Kön;
公众人物(字符串förNamn、字符串efterNamn、字符串personnumer)
{
字符串förnamn=förnamn;
字符串efternamn=efternamn;
字符串personnumer=personnumer;
}
静态布尔卢恩(字符串personnumer)
{
整数和=0;
for(int i=0;i
在所有代码之前,添加此行

string debuggerIsMyFriend = form.textBox3.Text;

在该行上设置断点,运行代码并将鼠标悬停在变量上以查看它实际包含的内容,我打赌这不是您期望的10个字符的字符串,我非常确定您的行
string siffrasstring=form.textBox3.Text.Substring(8,1)没有10个数字


检查
form.textBox3.Text的值,例如Jacopo。

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

文本框中的字符串长度肯定不会超过9个字符,除非您100%确定输入是9个字符,否则您应该优雅地处理它

经验法则:在没有首先检查数组长度的情况下,不要尝试访问数组的索引

…第二条经验法则:如果您认为有可疑之处,请确保访问的UI控件正确

公共字符串kollaKön()
{
//字符串siffraAsString=form.textBox3.Text.Substring(8,1);
int-siffrasnum=GetNinthNumber(form.textBox3.Text);
int result=(siffrasnum%2);
如果(结果==1)
{
return form.textBox5.Text=(“Är en Man”);
}
其他的
{
return form.textBox5.Text=(“Är en Kvinna”);
}
}
公共静态int GetNinthNumber(字符串str)
{
字符串numberField=str.Trim();
如果(numberField.Length<9)
{
//处理少于9宗个案
返回0;
}
其他的
{
整数;
bool isNumber=Int32.TryParse(str[8].ToString(),out number);
如果(!isNumber)
{
抛出新异常(“值不是数字”);
}
返回号码;
}
}

您的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");
    }
}

您是否100%确定字符串长度为10个字符?你调试好了吗?如果你只需要一个数字,为什么不干脆
char-siffraAsString=form.textBox3.Text[8]
?您能否展示一个字符串的示例,并在第一行设置一个断点,然后使用调试器评估
textBox3。Text
看起来也像是根据字符串的数组索引位置来读取字符串。Parse
需要字符串而不是字符,对吗?@Charleh-
int.Parse
需要一个字符串字符串作为参数。您的意思是
添加行
而不是
如果
OP
能向我们展示一个文本示例也很好,我想知道文本框中是否有带空格的文本。。这也会引起一个问题,但如果没有看到文本框的内容,就很难确定到底发生了什么。我现在添加了一个字符串示例,Jacopo-如果我理解正确,它会显示{Text=”“}@k
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;