为什么调用Document.GetElementsByTagName(“img”)[109]导致我的程序崩溃?

时间:2016-04-30 16:37:57

标签: c# arrays indexoutofrangeexception

当我打电话

webBrowser1.Document.GetElementsByTagName("img")[109].GetAttribute("src")

该程序与IndexOutOfRangeException崩溃。但是,当我打电话时

webBrowser1.Document.GetElementsByTagName("img")[99].GetAttribute("src")

程序成功运行,没有抛出异常。唯一的区别是99对109,为什么会导致崩溃?

2 个答案:

答案 0 :(得分:3)

当调用者尝试获取超出集合边界的元素时,抛出IndexOutOfRangeException。如果集合有10个项目,并且您尝试访问第10个,第11个或第100个索引,则会抛出此异常。

当抛出异常并且未处理时,运行时将终止您的程序(即您的程序将"崩溃")。您可以找到有关C#异常和异常处理here的更多信息。

这就是你发生的事情;也许只有100个项目,第99个索引是集合中的最后一个项目。在任何情况下,索引109都没有项目,因此抛出此异常。如果未处理异常,CLR将终止您的程序。

为了防止抛出此异常,请务必检查数组的大小并请求这些边界内的项目。

例如:

~/.gitconfig

您还可以使用int numberOfImages = webBrowser1.Document.GetElementsByTagName("img").Count; for(int i = 0; i < numberOfImages; i++) { var src = webBrowser1.Document.GetElementsByTagName("img")[i].GetAttribute("src"); //use src here } 完全避免令人讨厌的int索引器:

foreach

答案 1 :(得分:0)

我这样做了。基本上我采取第一个雅虎图像。它的工作原理,谢谢你的帮助

 private  void Form1_Load(object sender, EventArgs e)
    {
        webBrowser1.ScriptErrorsSuppressed = true;
        webBrowser1.Navigate("https://it.images.search.yahoo.com/images");
    }
    int a = 1;
    private async void button1_Click(object sender, EventArgs e)
    {
        if (a == 1)
        {
            webBrowser1.Document.GetElementById("yschsp").InnerText = textBox1.Text;
            webBrowser1.Document.GetElementsByTagName("input")[1].InvokeMember("click");
            do
            {
                Application.DoEvents();
            } while (webBrowser1.ReadyState != WebBrowserReadyState.Complete);
            await PutTaskDelay();
            pictureBox1.ImageLocation = webBrowser1.Document.GetElementsByTagName("img")[0].GetAttribute("src");
            a = a + 1;
        }
        else
        {
            webBrowser1.Document.GetElementById("yschsp").InnerText = textBox1.Text;

            webBrowser1.Document.GetElementById("sbx_x").InvokeMember("click");
            do
            {
                Application.DoEvents();
            } while (webBrowser1.ReadyState != WebBrowserReadyState.Complete);
            await PutTaskDelay();
            pictureBox1.ImageLocation = webBrowser1.Document.GetElementsByTagName("img")[0].GetAttribute("src");
        }
    }
    async Task PutTaskDelay()
    {
        await Task.Delay(1000);
    }