Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的代码在使用WatIn时返回空对象引用错误?_C#_Arrays_For Loop_Watin_Nullreferenceexception - Fatal编程技术网

C# 为什么我的代码在使用WatIn时返回空对象引用错误?

C# 为什么我的代码在使用WatIn时返回空对象引用错误?,c#,arrays,for-loop,watin,nullreferenceexception,C#,Arrays,For Loop,Watin,Nullreferenceexception,我一直得到一个空对象引用错误,但不知道为什么。 我有一个包含100个URL的CSV文件。该文件被读入一个名为“lines”的数组中 下一部分是我得到空对象错误的地方。当我尝试使用WatIn转到lines数组中的第一项时,它表示我引用了一个空对象 private void GoToEditLinks() { for (int i = 0; i < lines.Length; i++) {

我一直得到一个空对象引用错误,但不知道为什么。 我有一个包含100个URL的CSV文件。该文件被读入一个名为“lines”的数组中

下一部分是我得到空对象错误的地方。当我尝试使用WatIn转到lines数组中的第一项时,它表示我引用了一个空对象

private void GoToEditLinks()
    {                        
        for (int i = 0; i < lines.Length; i++)
        {
            //go to each link sequentially
            myIE.GoTo(lines[i].ToString());

            //sleep so we can make sure the page loads
            System.Threading.Thread.Sleep(5000);                  
        }
    }
我想我可以用lines.Length来告诉它数组有多大,但这不起作用。奇怪的是,我可以毫无问题地使用以下代码:

//returns the accurate number of urls that were in the CSV we read in earlier
txtbx1.text = lines.Length;

//or
//this returns the last entry in the csv, as well as the last entry in the array
TextBox2.Text = lines[lines.Length - 1];
我很困惑为什么数组中显然有项目,可以调用它们来填充文本框,但当我尝试在for循环中调用它们时,它会说它是空引用

更新: 通过将光标放在对行的两个调用上并按f12键,我发现它们都指向同一个实例。接下来的想法是我没有及时调用ReadLinksIntoMemory,下面是我的代码:

private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;

        ReadLinksIntoMemory();

        GoToEditLinks();

        button1.Enabled = true;

    }
除非我弄错了,否则代码说在调用GoToEditLinks之前必须完成ReadLinksIntoMemory方法?如果ReadLinksIntoMemory未及时完成,我将无法用行数组长度和/或最后一个条目填充文本框

更新:进入方法GoToEditLinks()时,我看到行在调用前为null:

myIE.GoTo(lines[i]);
但是当它点击goto命令时,值从null变为它应该去的url,但同时它给了我null对象错误

更新: 我添加了一个IsNullOrEmpty检查方法,数组通过它时没有任何问题。我开始认为这是WatIn和myIE.GoTo命令的问题

我想这是堆栈跟踪/调用堆栈

Program.exe!Program.Form1.GoToEditLinks() Line 284  C#
Program.exe!Program.Form1.button1_Click(object sender, System.EventArgs e) Line 191 + 0x8 bytes C#
[External Code] 
Program.exe!Program.Program.Main() Line 18 + 0x1d bytes C#
[External Code] 
解决方案:
原来问题出在WatIn身上。在正常情况下,我已经初始化了myIE对象,但在本例中,我对这两种方法进行了速记测试,这意味着myIE对象尚未创建!我首先运行了初始化myIE对象的方法,它成功了。感谢大家帮助我完成这项工作。

前两个示例中的代码看起来不错,前提是
readlinksintomory()
首先运行。它创建
数组

试试这个:

  • 将光标放在内存的读链接中的
    行上,按F12。它应该转到类顶部的声明

  • 将光标放在GoToEditLink内的
    行上。它应该带你到同一个声明

  • 要么您会发现有两个声明用于
    ,要么您没有及时调用readlinksintomory()

    您不需要
    行=新字符串[10]


    步骤2:将断点放在ReadLinksIntoMemory和GoToEditLink的开头。确保第一个先断

    然后在GoToEditLink内部,仔细检查行、行、长度和(部分)内容

    String.Split()的这种变体不应产生
    null
    条目,但仍然:

    for (int i = 0; i < lines.Length; i++)
    {
      //go to each link sequentially
      string line = lines[i]; 
      myIE.GoTo(line);   // set a breakpoint here with the Condition `line == null`. 
    
      ...
    }
    
    for(int i=0;i

    请注意,没有理由对
    字符串[]

    中的元素执行
    .ToString()
    ,无法从代码中看出为什么行或行[i]将为空,但它就是这么说的。
    测试null/IsNullOrEmpty,不管怎样,这都是一个好的实践,添加一个else并抛出一个ArgumentNullException,在此基础上进行调试并点击go。事情可能会变得更清楚。

    不是答案,但在使用as-use-calls-dispose时不需要调用dispose它本身就是数组null还是仅仅是行?如果它只是您可以一直使用的行:
    string.IsNullOrEmpty
    在使用之前测试它…您可以发布准确的错误详细信息,最好是使用stackdump吗?所有行都不应为空,csv是通过读取1个csv,然后删除任何不包含“编辑”一词的行来创建的。csv中有100个条目,lines.length返回为100。当错误发生并使程序崩溃时,堆栈是否转储“详细信息”中包含的信息?
    Program.exe!Program.Form1.GoToEditLinks() Line 284  C#
    Program.exe!Program.Form1.button1_Click(object sender, System.EventArgs e) Line 191 + 0x8 bytes C#
    [External Code] 
    Program.exe!Program.Program.Main() Line 18 + 0x1d bytes C#
    [External Code] 
    
    for (int i = 0; i < lines.Length; i++)
    {
      //go to each link sequentially
      string line = lines[i]; 
      myIE.GoTo(line);   // set a breakpoint here with the Condition `line == null`. 
    
      ...
    }