SamFad Ответов: 2

Как решить эту проблему с ошибкой "ссылка на объект не установлена на экземпляр объекта"


В настоящее время я разрабатываю биометрическое приложение, и все, кажется, работает хорошо, пока не доходит до приведенного ниже фрагмента кода. Переменная fs генерирует ошибку " ССЫЛКА на объект не установлена на экземпляр объекта"

Попробуй
Используя ФС как FileStream = ИО.Файл.Open (lblPath.Текст + " / " + txtFoundationNo.Текст +". fpt", IO.FileMode.OpenOrCreate, ИО.Флагами fileaccess.Писать)
Шаблон.Сериализация (fs)
Конец Использования
Поймать ex как исключение
MsgBox(ex. Message, MsgBoxStyle.Восклицание: "Предупреждение Об Ошибке Регистрации!")
Конец Попытки

Что я уже пробовал:

Я пробовал разные способы объявления переменной
Некоторые из опробованных деклараций, как указано ниже, перечислены ниже:

1.
Тусклый fs как новый IO.FileStream(lblPath.Текст + " / " + txtFoundationNo.Текст +". fpt", IO.FileMode.OpenOrCreate, ИО.Флагами fileaccess.Писать)

2.
Тусклый fs как новый IO.FileStream(lblPath.Текст + " / " + txtFoundationNo.Текст +". fpt", IO.FileMode.OpenOrCreate, ИО.Флагами fileaccess.Писать)
Использование fs
Шаблон.Сериализация (fs)
Конец Использования

Я все равно получаю одно и то же сообщение об ошибке.

FranzBe

Попробуйте составить имя файла с помощью path перед вызовом New FileStream и проверьте, указывает ли содержимое переменной на ваш файл.

Dim fileNameWithExtention As String = txtFoundationNo.Текст + ".ФПТ"
Дим fileNameWithPath как String = система.ИО.Путь.Combine (lblPath. Text, fileNameWithExtention)

Тусклый fs как новый IO.FileStream(fileNameWithPath, IO. FileMode.OpenOrCreate, ИО.Флагами fileaccess.Писать)

SamFad

Спасибо за ваш ответ.
Я все еще получаю то же самое сообщение об ошибке

Richard MacCutchan

Вы должны использовать свой отладчик, чтобы пройти через код и точно выяснить, какая ссылка не устанавливается.

SamFad

Благодарю вас сэр,
Я пробовал использовать отладчик по отдельности, но, похоже, не мог точно определить, где именно находится ошибка.

Прежде чем произойдет ошибка, используя отладчик для проверки значений переменной fs, я получу следующие значения:

ФС|{система.ИО.Хранилище FileStream}
* CanRead = = False
* CanSeek = = True
* CanTimeout = = False
* CanWrite = = True
* DefaultBufferSize == 4096
*ERROR_BROKEN_PIPE == 109
*ERROR_NO_DATA == 232
* GENERIC_READ == -214748648
* Ручка = = 1448
*IsAsync = = False
* Длина = = 0
* Позиция = = 0
Есть ли в приведенном выше значении какое-либо значение, которое может служить указателем на возможную причину ошибки?

Richard MacCutchan

В какой строке кода произошла ошибка? Из приведенных выше значений следует, что объект FileStream является допустимым, поэтому вы должны посмотреть дальше.

SamFad

Шаблон.Сериализация (fs)

Richard MacCutchan

Так в чем же ценность шаблона?

2 Ответов

Рейтинг:
2

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, в котором вы держите ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень забавный вид, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего такого, что обычно делали бы, когда извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, на которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы выяснить, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы сможете узнать!


Рейтинг:
10

SamFad

Спасибо всем.

Я решил код проблемы. В приведенном ниже блоке кода показано, как мне удалось решить эту проблему.

1. Тусклый fileNameWithExtention As String = txtFoundationNo.Текст + ".ФПТ"
2. Тусклый fileNameWithPath As String = lblPath.Текст &ампер; "\" &амп; fileNameWithExtention
3. fileNameWithPath = Струнные.Заменить(fileNameWithPath, "/", "\")
4.
5. С помощью ФС Как ИО.Хранилище FileStream = ИО.Файл.Открыть(fileNameWithPath ИО.Содержит filemode.Создать ИО.Флагами fileaccess.Писать)
6. Шаблон.Сериализовать(ФС)
7. Конец Использования

OriginalGriff, ваше решение было БАМ! это заставило меня задуматься. Подсказка Франца тоже была полезна.
Однако линия 5 была тем местом, где лежит решение. Все предыдущие объявления в моем предыдущем коде фактически создавали файлы с нулевым (0) байтом. Таким образом, к тому времени, когда он доберется до строки 6, переменная fs выдаст ошибку исключения.
Что я в конце концов сделал, так это включил имя файла (т. е.fileNameWithPath) в декларации в строке 5, и это сработало как волшебство.
Еще раз благодарю всех вас за Ваш полезный вклад.


Member 14551914

охраняемых недействительными login_click_Click(объект отправителя, EventArgs в электронной)
{
SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings ["Registrationconnectionstring"].Параметр connectionString);
против.Открыть();
строка checkuser = " select count (*) from logintab where username=' " + TextBoxUsername.Текст + "'";
SqlCommand com = new SqlCommand(checkuser, con);
int temp = конвертировать.ToInt32 (com. ExecuteScalar ().Метод toString());
против.Закрывать();
если (temp == 1)
{
против.Открыть();
строка checkPasswordQuery = " выберите пароль из logintab, Где username=' " + TextBoxUsername.Текст + "'";
Sqlcommand, который passcom = новая команда sqlcommand(checkPasswordQuery, кон);
строковый пароль = passcom.ExecuteScalar ().ToString (). Replace(" ", "");
если (пароль == TextBoxPassword.Текст)
{
Session ["new"] = TextBoxPassword.Текст;
Ответ.Напишите ("Успешно");
}
ещё
{
Ответ.Write ("неверный пароль");
}
}
ещё
{
Ответ.Write ("неверное имя пользователя");
}
}
}


Я использовал этот код для получения значений из БД, но он показывал ошибку.
Ошибка: ссылка на объект не устанавливает объект экземпляра