每当我尝试运行我刚刚创建的字典编辑器时,我都会收到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#
答案 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);