Я получаю ошибку ссылки на нулевой объект, но не могу сказать, почему.У меня есть файл 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, и он сработал.Спасибо всем за помощь в прохождении этого.