C# 错误:长度不能小于 0

本文关键字:不能 小于 错误 | 更新日期: 2023-09-27 18:33:30

我的 C# 程序有问题:我创建了一个包含 10 个问题和 10 张图像的测验。我在生产线上得到这个Length cannot be less than zero.'r'nParameter name: length

int imageIndex = int.Parse(line.Substring(0, delimiter));

即使在我的记事本文件中我也包含了图像索引:

3:What is the foo in the bar? 
10:How can you add a widget? 
4:Why pick a bar over a foo?

这是代码:

if (nr >= questions.Count)
{
    button1.Enabled = false;
}
else
{
    Random r = new Random();
    int x;
    do   
    { 
        x = r.Next(questions.Count); 
    } 
    while (questions[x].displayed == true);
    textBox1.Text = questionText;
    radioButton1.Text = questions[x].answer1; 
    radioButton2.Text = questions[x].answer2;
    questions[x].displayed= true;
    current_question = x;
}

C# 错误:长度不能小于 0

你之前有过这样的一行:

int delimiter = line.IndexOf(':');

。但是您随后不会检查返回值。如果它是 -1,这意味着在该特定行中找不到您的分隔符 - 但无论如何您都会将其传递给Substring。在使用delimiter之前检查它的值 - 这样你就可以抛出一个更有用的异常(或跳过该行,或任何你想做的事情(。

我实际上建议你对代码进行重大更改 - 而不是将questions保留为List<string>或其他任何东西,我会创建一个Question类。 在阅读文本行时解析文本行,丢弃失败 - 或抛出异常 - 在这一点上,而不是等到你碰巧遇到坏问题。然后,您可以有一个List<Question>,这将使代码的其余部分更简单。

您可能希望保留一个Queue<Question>,该最初是完整列表的副本,经过随机播放。当您想要显示新问题时,只需从该队列中获取下一个元素即可。这样,您无需在选择已显示的问题时循环往复。(您可能希望在Question类中包含IndexQuestionNumber属性,大概...

请注意,它可能适用于您真正知道的所有行,但文件末尾有一些空行。您可能只想跳过空行。

子字符串参数是初始索引和长度。 代码中的分隔符看起来不像长度。

http://msdn.microsoft.com/en-us/library/aka44szs.aspx

更改关注

int delimiter = line.IndexOf(':'); 
int imageIndex = int.Parse(line.Substring(0, delimiter)); 
string questionText=line.Substring(delimiter + 1); 
pictureBox1.Image = imageList1.Images[imageIndex];  
textBox1.Text = questionText;
radioButton1.Text = questions[x].answer1;  
questions[x].displayed= true; 
current_question = x; 

int delimiter = line.IndexOf(':'); 
 if(!String.IsNullOrEmpty(line) && delimiter > 0 )
    {
        int imageIndex = int.Parse(line.Substring(0, delimiter)); 
        string questionText=line.Substring(delimiter + 1); 
        pictureBox1.Image = imageList1.Images[imageIndex];  
        textBox1.Text = questionText;
        radioButton1.Text = questions[x].answer1;  
        questions[x].displayed= true; 
        current_question = x; 
    }
private string copystring(string instr ,int start ,int length)
{
    return instr.Length >= (start + 1) 
        ? (instr.Length > (start + length) ? instr.Substring(start, length) : instr.Substring(start,instr.Length-start)) 
        : "";
}