Argumentoutofrange例外

时间:2014-09-10 21:08:42

标签: c#

每当我尝试运行我刚刚创建的字典编辑器时,我都会收到Argumentoutofrange异常。到目前为止,我只是想检查用户输入的单词是否是从文件读入的列表的一部分,实际字典编辑器的逻辑和检查是在两个单独的文件中。

一切正常,直到我按下开始检查的按钮,当我调用构造函数进行检查时异常出现。

以下是字典编辑器的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SpellChecker;

namespace DictionaryEditor
{
public partial class DictionaryEditor : Form
{

    public DictionaryEditor()
    {
        InitializeComponent();
        this.Paint += new PaintEventHandler(f_Paint); //Paints the title onto the form
    }

    //Paint handler to make the title
    static void f_Paint(object sender, PaintEventArgs e)
    {

    }

    //Override OnPaint to make the title
    protected override void OnPaint(PaintEventArgs e)
    {
        //Call OnPaint
        base.OnPaint(e);

        //Make graphics variable
        Graphics g = e.Graphics;

        // Get the width of the form to make the title
        int titleWidth = ((this.ClientSize.Width)/2)-100;

        // Get the font for the title
        Font titleFont = new Font("Arial", 25);

        g.DrawString("Dictionary Editor", titleFont, Brushes.DarkCyan, titleWidth, 20);
    }

    private void ExitBtn_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void SpellCheckBtn_Click(object sender, EventArgs e)
    {
        SpellCheck spellTest = new SpellCheck();

        string answer = spellTest.CheckSpelling(HeadwordTxt.Text);

        MessageBox.Show("The calculations are complete", "My Application",
        MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    }

}
}

异常发生在此行的SpellCheckBtn事件处理程序的第一行

   SpellCheck spellTest = new SpellCheck();

此构造函数可在SpellCheck文件中的此代码中找到

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Diagnostics;

namespace SpellChecker
{
public class SpellCheck
{
    private List<string> correctWords = new List<string>(); //List to hold words from the text file

    public SpellCheck()
    {
        string line;  //String to hold a line from the file

        //Make StreamReader and put words into correctWords
        using (StreamReader reader = new StreamReader("WordList.txt"))
        {
            while ((line = reader.ReadLine()) != null)
            {
                correctWords.Add(line);
            }
        }
    }

    public string CheckSpelling(string theString)
    {
        int i = 0;            //Counter for postion of correctWords

        //loop to check all words
        while (correctWords[i] != null)
        {
            if (theString.Equals(correctWords[i]))
            {
                return "Word " + theString + " is spelled correctly." +     Assembly.GetExecutingAssembly().GetName().Name + Assembly.GetEntryAssembly().GetName().Version ;
            }

        }

        return "Invalid Spelling";
    }



}
}

我已经被困在这一段很久了,所以任何帮助都会受到赞赏。

这是用于检查字典编辑器中单词的按钮的事件处理程序

 private void SpellCheckBtn_Click(object sender, EventArgs e)
{
    SpellCheck spellTest = new SpellCheck();

    string answer = spellTest.CheckSpelling(HeadwordTxt.Text);

    MessageBox.Show("The calculations are complete", "My Application",
    MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}

这是拼写检查的构造函数

 public SpellCheck()
    {
        string line;  //String to hold a line from the file

        //Make StreamReader and put words into correctWords
        using (StreamReader reader = new StreamReader("WordList.txt"))
        {
            while ((line = reader.ReadLine()) != null)
            {
                correctWords.Add(line);
            }
        }
    }

抛出异常时,它位于堆栈的顶部:

>   DictionaryEditor.exe!DictionaryEditor.DictionaryEditor.SpellCheckBtn_Click(object sender,     System.EventArgs e) Line 53   C#

3 个答案:

答案 0 :(得分:1)

CheckSpelling方法应更改为更安全的&#39;

public string CheckSpelling(string theString)
{
    //loop to check all words
    foreach(string word in correctWords)
    {
        if (theString.Equals(word))
        {
            return "Word " + theString + " is spelled correctly." +     Assembly.GetExecutingAssembly().GetName().Name + Assembly.GetEntryAssembly().GetName().Version ;
        }
    }
    return "Invalid Spelling";
}

您的实际代码假定在correctWords列表中始终至少有一个条目,并启动无限循环,始终检查索引0处的条目。(变量i的增量不可见)。
如果没有条目,使用foreach将避免检查List。

但是我会检查加载correctWord列表的代码。您的文件可能不包含任何单词,或者单词在不同的行中没有正确分隔,或者您打开的文件不是您打算打开的文件(不同的文件夹?)

修改
正如您在下面的评论中所读到的,事实证明问题是作为解决方案一部分的两个项目之间的平台不匹配。一个项目(SpellChecker)是为AnyCPU配置为目标平台,而另一个(DictionaryEditor)是为x86平台配置的。此方案会导致奇怪的OutOfRange异常。将SpellChecker项目转换为x86解决了问题(反之,将DictionaryEditor转换为AnyCPU)

答案 1 :(得分:0)

如果索引超出范围,List<T>的索引器会抛出异常。在尝试访问该索引处的列表之前,您需要检查索引是否有效。

您需要将i与列表的Count进行比较:

while(i < correctWords.Count) { ... }

或只使用foreach

foreach (string word in correctWords)
{
    if (theString.Equals(word))
    {
        return "Word " + theString + " is spelled correctly." +     Assembly.GetExecutingAssembly().GetName().Name + Assembly.GetEntryAssembly().GetName().Version ;
    }
}
return "Invalid Spelling";

答案 2 :(得分:0)

从上面的评论和你的回复中,我怀疑问题出现在“HeadwordTxt.Text”中,特别是当你说你评论了构造函数的逻辑时,你能用正常的替换“HeadwordTxt.Text”吗?字符串并尝试一下?所以代码是

string answer = spellTest.CheckSpelling("test");
MessageBox.Show("The calculations are complete " + answer, "My Application",
MessageBoxButtons.OK, MessageBoxIcon.Asterisk);