Почему мой код возвращает ошибку Null Object Refrence при использовании WatIn? - PullRequest
0 голосов
/ 19 ноября 2011

Я получаю ошибку ссылки на нулевой объект, но не могу сказать, почему.У меня есть файл CSV, который содержит 100 URL.Файл читается в массив, называемый «линии».

public partial class Form1 : System.Windows.Forms.Form
{
    string[] lines;
    public Form1() ...    

private void ReadLinksIntoMemory()
    {
        //this reads the chosen csv file into our "lines" array
        //and splits on comma's and new lines to create new objects within the array
        using (StreamReader sr = new StreamReader(@"C:\temp.csv"))
        {
            //reads everything in our csv into 1 long line
            string fileContents = sr.ReadToEnd();

            //splits the 1 long line read in into multiple objects of the lines array
           lines = fileContents.Split(new string[] { ",", Environment.NewLine },
                StringSplitOptions.RemoveEmptyEntries);

            sr.Dispose();
        }
    }

Следующая часть, где я получаю ошибку нулевого объекта.Когда я пытаюсь использовать WatIn для перехода к первому элементу в массиве строк, он говорит, что ссылается на нулевой объект.

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);                  
        }
    }

Когда я отлаживаю код, он говорит, что запрос GoTo вызывает строки, которыеноль.

Кажется, мне нужно объявить массив, но разве мне не нужно указывать точный размер для этого?Пример:

lines = new string[10]

Я думал, что смогу использовать строки. Длина, чтобы сказать, насколько велик массив, но это не сработало.Что странно для меня, так это то, что я могу без проблем использовать следующий код:

//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];

Я запутался, почему в массиве явно есть элементы, их можно вызывать для заполнения текстового поля, но когда я пытаюсьчтобы вызвать их в цикле my, он говорит, что это нулевая ссылка?

ОБНОВЛЕНИЕ: поместив курсор на оба вызова строк и нажав клавишу f12, я обнаружил, что они оба переходят в один и тот же экземпляр.Следующая мысль состоит в том, что я не вызываю ReadLinksIntoMemory во времени, ниже приведен мой код:

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

        ReadLinksIntoMemory();

        GoToEditLinks();

        button1.Enabled = true;

    }

Если я не ошибаюсь, код говорит о том, что метод ReadLinksIntoMemory должен завершиться до вызова GoToEditLinks?Если ReadLinksIntoMemory не завершился вовремя, я не смог бы заполнить свои текстовые поля длиной массива строк и / или последней записью.

UPDATE: вход в метод GoToEditLinks (), я вижу, что строкиnull, прежде чем он вызовет:

myIE.GoTo(lines[i]);

, но когда он попадает в команду goto, значение изменяется с нуля на URL, на который предполагается перейти, но в то же время он выдает ошибку нулевого объекта?

ОБНОВЛЕНИЕ: я добавил метод проверки 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, и он сработал.Спасибо всем за помощь в прохождении этого.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Из вашего кода не видно, почему строки или строки [i] будут нулевыми, но это то, что он говорит. Протестируйте оба для null / IsNullOrEmpty, в любом случае это хорошая практика, добавьте else и бросьте, скажем, ArgumentNullException, вставьте отладку и нажмите go. Все может стать яснее.

0 голосов
/ 19 ноября 2011

Код в первых двух примерах выглядит нормально, при условии, что сначала запускается ReadLinksIntoMemory().Он создает массив lines.

Попробуйте:

  1. наведите курсор на lines внутри ReadLinksIntoMemory, нажмите F12.Следует перейти к объявлению в верхней части класса.

  2. наведите курсор на lines внутри GoToEditLink.Это должно привести вас к той же декларации.

Либо вы обнаружите, что есть 2 объявления для lines, либо вы не вызываете ReadLinksIntoMemory () вовремя.

Вам не нужно lines = new string[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`. 

  ...
}

Обратите внимание, что для .ToString() нет причины для элемента из string[]

...