当我运行编译器时会抛出异常:
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;
}
}
}
答案 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;
}
}