为什么我得到异常错误索引超出范围异常
本文关键字:异常 范围 索引 错误 为什么 | 更新日期: 2023-09-27 18:30:45
在 Form1 构造函数中,我有:
if (System.IO.File.Exists(keywords_path_file))
{
ListBoxLoadKeys(LocalyKeyWords, keywords_path_file);
}
else
{
fileExist = new StreamWriter(keywords_path_file);
fileExist.Close();
ListBoxLoadKeys(LocalyKeyWords, keywords_path_file);
}
我使用断点并看到该文件存在:
C:'Users'bout0_000'AppData'Local'GatherLinks'GatherLinks'Keywords'Keywords.txt
文件内容为:
http://www.walla.co.il,walla
http://www.cnet.com,cnet
http://rotter.net/forum/scoops1/29961.shtml,rotter
http://vanessawest.tripod.com/crimescenephotos.html,VanessaWest
http://rotter.net/forum/scoops1/45227.shtml,scoops
https://www.google.com/search?q=live+cameras,live camera
https://www.google.com/search?q=rape+images&oq=+images&aqs=chrome..69i57.1661j0&sourceid=chrome&ie=UTF-8,hi
https://www.google.com/search?q=+images&um=1&ie=UTF-8&hl=en&tbm=isch&source=og&sa=N&tab=wi&ei=GqotUv2kA4OftAae94DoAg&biw=951&bih=457&sei=oaotUtDqM8WbtAag3IFg#hl=en&q=+and+&tbm=isch&um=1,chud
http://www.test.com,test
该文件包含 9 个键和关键字。左侧是键 右侧是关键字。
然后进入这种方法:
private void ListBoxLoadKeys(Dictionary<string, List<string>> dictionary, string FileName)
{
List<string> urls = new List<string>();
using (StreamReader sr = new StreamReader(FileName))
{
while ((line = sr.ReadLine()) != null)
{
int i = line.Count();
tokens = line.Split(',');
dictionary.Add(tokens[0], tokens.Skip(1).ToList());
data.Add("Url: " + tokens[0] + " --- " + "Localy KeyWord: " + tokens[1]);
urls.Add(tokens[0]);
}
}
listBox1.DataSource = data;
listBox1.Tag = urls;
}
在方法中,当它得到 o 行时:listBox1.数据源 = data;它的跳转并执行此事件:
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedItem != null)
{
label4.Text = listBox1.SelectedItem.ToString();
string startTag = "Url: ";
string endTag = " ---";
int startTagWidth = startTag.Length;
int endTagWidth = endTag.Length;
int index = 0;
index = label4.Text.IndexOf(startTag, index);
int start = index + startTagWidth;
index = label4.Text.IndexOf(endTag, start + 1);
string g = label4.Text.Substring(start, index - start);
label4.Text = g;
mainUrl = g;
}
}
最后,我看到数据和listBox1.DataSource都包含9个项目。
完成所有这些之后,程序正在运行。我在列表框的右侧看到项目键和关键字。一旦我单击 listBox1 中的一个键,我就会在该行上出现异常:
if (listBox1.SelectedItem != null)
在listBox1_SelectedIndexChanged事件中。
例外情况是:
索引超出数组的范围
System.IndexOutOfRangeException was unhandled
HResult=-2146233080
Message=Index was outside the bounds of the array.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.ListBox.ItemArray.GetItem(Int32 virtualIndex, Int32 stateMask)
at System.Windows.Forms.ListBox.get_SelectedItem()
at GatherLinks.Form1.listBox1_SelectedIndexChanged(Object sender, EventArgs e) in d:'C-Sharp'GatherLinks'GatherLinks-2'GatherLinks'GatherLinks'Form1.cs:line 543
at System.Windows.Forms.ListBox.OnSelectedIndexChanged(EventArgs e)
at System.Windows.Forms.ListBox.WmReflectCommand(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.SendMessage(HandleRef hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.Control.SendMessage(Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.Control.ReflectMessageInternal(IntPtr hWnd, Message& m)
at System.Windows.Forms.Control.WmCommand(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WmKillFocus(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ListBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException:
我知道异常意味着什么,但我得到了它以及如何解决它?
例如,如果我在运行程序时首先移动,键在listBox中的键之间上下移动,然后单击其中一个,我没有得到任何异常。例外情况是在我运行程序并立即用鼠标单击listBox中的一个键时出现的。
在它们之间移动,然后单击其中一个是可以的,但首先单击其中一个会例外。
编辑**
我现在看到,在它进入listBox1_SelectedIndexChanged事件之前,该事件 istBox1 鼠标向下:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
if (Control.ModifierKeys == Keys.Control || ( Control.ModifierKeys == Keys.Control || e.Button == MouseButtons.Left))
{
listBox1.SelectionMode = SelectionMode.MultiExtended;
}
else if (e.Button == MouseButtons.Left)
{
listBox1.SelectionMode = SelectionMode.One;
}
}
执行此行:
listBox1.SelectionMode = SelectionMode.MultiExtended;
然后返回到 selectedindexchanged 事件并在行上抛出异常:
if (listBox1.SelectedItem != null)
这也是行号:543
你不能这样做:
private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
if (Control.ModifierKeys == Keys.Control || ( Control.ModifierKeys == Keys.Control || e.Button == MouseButtons.Left))
{
listBox1.SelectionMode = SelectionMode.MultiExtended;
}
else if (e.Button == MouseButtons.Left)
{
listBox1.SelectionMode = SelectionMode.One;
}
}
我认为,在 MouseDown 事件中更改该属性会破坏窗口并再次重新创建它,这会弄乱在 SelectedIndexChanged 事件期间触发的内部信息。
只需注释掉该代码,并在设计时确定 ListBox 控件应具有哪种选择模式。
您还应该确保获得正确的索引值,例如:
index = label4.Text.IndexOf(endTag, start + 1);
if (index > -1) {
string g = label4.Text.Substring(start, index - start);
label4.Text = g;
}
这是反编译代码,在本例中,此处stateMask
是标识选定项的状态掩码。
public object GetItem(int virtualIndex, int stateMask)
{
int actualIndex = this.GetActualIndex(virtualIndex, stateMask);
if (actualIndex == -1)
throw new IndexOutOfRangeException();
else
return this.entries[actualIndex].item;
}
因此,必须更改某些内容,因为正如Sriram指出的那样,SelectedItem
属性中有以下检查:
public object SelectedItem
{
get
{
if (this.SelectedItems.Count > 0)
return this.SelectedItems[0];
else
return (object) null;
}
}
所以它以某种方式通过这里,然后在GetItem
上失败. 我怀疑有一些线程愚蠢。
我已经稍微看了一下,可以得出结论,问题可能不在于您提供给我们的任何代码,而在于其他问题。我不赞成多线程进行的建议,因为WinForm中的多线程是非法的,并且会导致不同的异常。
您需要做的是user2760148为我们提供一个小而完整的示例。创建一个新项目并实现具有相同结果的尽可能少的代码。
第一步是对列表框的数据进行硬编码,并仅具有该 mouseDown 事件处理程序。然后慢慢地重新添加代码,直到找到问题所在。很有可能你会自己发现问题...至少您会找到导致问题的步骤。目前,这个例子中的"噪音"太多,我们无法轻松找到具体问题。