Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399

Tcpclient вызывает nullreference exception, но не равен null

26.07.2019, 10:39. Показов 3651. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если к серверу не удалось подключиться, то есть проблема при закрытии.

C#
1
2
3
4
5
6
7
8
Tcpclient client = new tcpclient () 
client.Connect (ip, port) 
Networkstream net = client. Getstream() 
catch{} 
... 
If (connect! =null) 
{
If(connect. Connected) - nullreference exception
Почему последнее условие выдаёт исключение, я ведь проверяю на null, конечно я могу проверить на null сначала network stream, и все таки?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2019, 10:39
Ответы с готовыми решениями:

Nullreference Exception при передаче объекта в представление
Добрый день! Начинаю знакомство с ASP.NET Core При попытке отобразить свойства модели в представлении возникает вышеуказанное...

TCPClient localhost ->Exception
Всем доброго времени суток! Такая проблема:пишу IPHostEntry ipHost = Dns.Resolve("localhost"); IPAddress ip = ipHost.AddressList; ...

Как выловить, что вызывает Exception?
Программа принимает данные через DDE и пишет их в StringGrid. Может часами висеть в свернутом виде и нормально работать (по таймеру в 5...

21
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
26.07.2019, 11:16
Цитата Сообщение от leonidSDF Посмотреть сообщение
Почему последнее условие выдаёт исключение, я ведь проверяю на null, конечно я могу проверить на null сначала network stream, и все таки?
Из этого кода - не понятно.
Ошибки быть не должно.
Может код в тему неправильно скопировали?

Что за переменная connect? Может это client? Или другое соединение?

И попробуйте такой вариант (если connect имеет тип Tcpclient)
C#
6
7
8
9
10
11
//if (connect! =null) 
//{
       if(connect?.Connected == true) //- nullreference exception
       {
             /// Блок if-true 
        }
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
26.07.2019, 11:23  [ТС]
Да, моя ошибка - client, ну я вижу что client tcpclient, это как его проверить? Но если на него при отладке наводишь то почти все свойства становятся в nullreference exception, но при этом условие на не null, он проходит. Оно в принципе и логично, ссылка живая, просто ей к серверу подключиться не удалось.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
26.07.2019, 11:42
Цитата Сообщение от leonidSDF Посмотреть сообщение
ссылка живая, просто ей к серверу подключиться не удалось.
У метода TcpClient.Connected - нет исключений.
Значит проблема всё таки в самом client.

Проверьте как я написал
C#
1
2
3
4
5
6
                TcpClient client = new TcpClient();
 
                if (client?.Connected == true)
                {
                    /// Блок if-true 
                }
Добавлено через 1 минуту
И лучше скиньте полностью код метода. Ошибка явно не в том коде что вы предоставили.
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
28.07.2019, 19:55  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 readThreed = new Thread(new ThreadStart(RunClient));
            readThreed.Start();
        }
 
        public void RunClient()
        {
            try
            {
                object[] args = new object[3]; //массив обънектов, который может иметь разные типы
                args[0] = txtboxStatus;
                args[1] = "Try to connect" + "\r\n";//массив обънектов, который может иметь разные типы
                args[2] = false;//без аппенда текст
                txtboxStatus.Invoke(delegateAddTextBox, args); 
                client = new TcpClient();
                client.Connect(IPAddress.Parse(ip), port);//!!Stay and waiting!! here until we get connection or exception
                args[0] = txtboxStatus;
                args[1] = "Have got connection" + "\r\n";
                args[2] = true;
                txtboxStatus.BeginInvoke(delegateAddTextBox, args);
                networkStream = client.GetStream();//socketStream = client.GetStream();
                String message = "Test 1 - Client -> Server";
                Byte[] bytesTx = System.Text.Encoding.ASCII.GetBytes(message);
                Byte[] bytesRx = new Byte[256];
                networkStream.Write(bytesTx, 0, bytesTx.Length); // Send the message to the connected TcpServer. 
                message = null;
                while ((message != "Server -> Terminated us") && (active))
                {
                    Int32 i = networkStream.Read(bytesTx, 0, bytesTx.Length); // 
                    if (i != 0)
                    {
                        message = System.Text.Encoding.ASCII.GetString(bytesTx, 0, i);
                        args[0] = txtboxReceive;
                        args[1] = "\r\n" + message;
                        args[2] = true;
                        txtboxReceive.Invoke(delegateAddTextBox, args);
                    }
                }
                networkStream.Close();// Close everything.
                client.Close();
            }
            catch (ArgumentNullException e)
            {
                MessageBox.Show(e.ToString());
            }
            catch (SocketException e)
            {
                if (e.ErrorCode == 10061)//could not set connection
                {
                    object[] args = new object[3];
                    args[0] = txtboxStatus;
                    args[1] = e.Message;
                    args[2] = false;//без аппенда текст
                    txtboxStatus.Invoke(delegateAddTextBox, args);
                }
                else
                {
                    MessageBox.Show(e.ToString());
                }
            }
            if (networkStream != null) networkStream.Close();
            if (client != null) client.Close();
        }
 
        public void AddTextBoxMethod(TextBox txtbT, string strT, bool append)
        {
            TextBox txtbTT = txtbT;
            if (!append) txtbTT.Text = strT;
            else txtbTT.AppendText(strT);
        }
        public void StopServer()
        {
            if (client != null)
            {
                if (client.Connected && (networkStream != null))-->!!!!! NULL reference exceptioN !!!!!!!! потому что клиент создан а соединения не было, А как тогда проверить что не было соединения?
                {
                    Byte[] bytesTx = System.Text.Encoding.ASCII.GetBytes("Client -> Terminated us");
                    try
                    {
                        networkStream.Write(bytesTx, 0, bytesTx.Length);
                    }
                    catch (SocketException exc) 
                    {
                        if (exc.ErrorCode == 10054)//пока так, код если сервер прекратил свое существование
                        {
                            MessageBox.Show(exc.ToString());
                        }
                        else MessageBox.Show(exc.ToString());
                    }
                    catch (Exception exc)
                    {
                        MessageBox.Show(exc.ToString());
                    }
                }
            }
            active = false;//переменная на один класс и на все потоки, поэтому закроет все потоки 
            if (client == null)
            {
                client.Close();
            }
        }
Добавлено через 3 минуты
Вот код, там внизу исключение, оно конечно не может быть Null, потому как объект создан, просто соединение не было, но тогда как проверить и при этом не попасть в исключение на conected
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 10:28
Цитата Сообщение от leonidSDF Посмотреть сообщение
Вот код, там внизу исключение, оно конечно не может быть Null, потому как объект создан, просто соединение не было, но тогда как проверить и при этом не попасть в исключение на conected
У вас многопоточный код. Там могут возникать нюансы из-за разной скорости выполнения потоков.

Вставьте такую тестовую проверку и сообщите результаты проверки
C#
70
71
72
73
74
75
        public void StopServer()
        {
            string testClient = client==null ? "null" : "not null";
            string textClientConnect = client.Connected==null ? "null" : "not null";
            if (client != null) // На этой строчке точка останова и проверить значения переменных testClient и textClientConnect
            {
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 10:28
Цитата Сообщение от leonidSDF Посмотреть сообщение
Вот код....
Для проверки мне нужен был код который выдаёт идентичную ошибку, но который можно запустить у меня. Или проект целиком.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 10:28
Лучше так проверить
C#
70
71
72
73
74
75
        public void StopServer()
        {
            string testClient = client==null ? "null" : "not null";
            string textClientConnect = client?.Connected==null ? "null" : "not null";
            if (client != null) // На этой строчке точка останова и проверить значения переменных testClient и textClientConnect
            {
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
29.07.2019, 10:58  [ТС]
Что-то я туплю, что означает client?. Connected а затем ещё один?

Добавлено через 2 минуты
Если этот вопрос лишний, первый, то первое not null, а второе при проверке выдало исключение, но в текст ушло null, это там где connected. В принципе я могу сбросить и проект, только вечером

Добавлено через 1 минуту
То есть понятно что часть от clienta находится в null, но как проверить, чтобы не вылетало при проверке в исключение, не понятно
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:04
Цитата Сообщение от leonidSDF Посмотреть сообщение
Что-то я туплю, что означает client?. Connected а затем ещё один?
Тернарный условный оператор - думал таким образом избежать исключения.
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
29.07.2019, 11:09  [ТС]
Не, один вопрос я удалил, должен же быть один, и потом с двумя ошибка.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:10
Цитата Сообщение от leonidSDF Посмотреть сообщение
а второе при проверке выдало исключение, но в текст ушло null,
Так вот это вообще не по сценарию.
Если выдало исключение - в текст ничего не должно было уходить...
Что-то я в недоумении....

В текст "null" (string) или null значение
Что-то я сам себя запутал.
Сделайте так
C#
72
73
            string testClient = client==null ? "нуль" : "не нуль";
            string textClientConnect = client?.Connected==null ? "нуль" : "не нуль";
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:13
Цитата Сообщение от leonidSDF Посмотреть сообщение
То есть понятно что часть от clienta находится в null, но как проверить, чтобы не вылетало при проверке в исключение, не понятно
Из документации https://docs.microsoft.com/ru-... mework-4.8
ЦитатаConnected Свойство получает состояние подключения Client сокета, начиная с последней операции ввода-вывода. При возврате false, Client сокет не подключен, или уже не подключен.

Так как Connected свойство только отражает состояние соединения, начиная с самой последней операции, следует попытаться отправить или получить сообщение, чтобы определить текущее состояние. После неудачной попытки отправить сообщение, это свойство больше не возвращает true. Обратите внимание, что это сделано намеренно. Нельзя надежно проверить состояние подключения, так как по времени между тестом и отправки и получения, соединение может быть разорвано. Ваш код должен предполагается сокет подключен и корректно обрабатывать неудавшиеся передачи.


То есть проверять надо не после соединения, а после попытки что-либо отправить.
Исключение, скорее всего, возникает внутри TcpClient при доступе какому-то внутреннему свойство которое устанавливается только после попытки отправки сообщения.
1
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
29.07.2019, 11:15  [ТС]
1 все таки client?.Connected или client.Connected .
2 сработало, второе значение null а не "нуль"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:16
Скиньте полный текст ошибки включая подробности. Там должно быть указанно в какой сборке каком типе при доступе к какому полю возникает эта ошибка.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:18
Цитата Сообщение от leonidSDF Посмотреть сообщение
сработало, второе значение "null а не" нуль
Всё равно странно, что string testClient = client==null ? "нуль" : "не нуль"; возвращает "не нуль"
А string textClientConnect = client?.Connected==null ? "нуль" : "не нуль";
- null

Исключения уже не возникает?
0
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
29.07.2019, 11:21  [ТС]
Возникает,
Сброшу, вечером
Согласно кд попробую тогда проверить на отправку
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16129 / 11253 / 2888
Регистрация: 21.04.2018
Сообщений: 33,084
Записей в блоге: 2
29.07.2019, 11:22
Цитата Сообщение от leonidSDF Посмотреть сообщение
Возникает,
А тогда понятно.
Скорее всего из-за того что не было отправки сообщения.
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
29.07.2019, 11:29
Цитата Сообщение от leonidSDF Посмотреть сообщение
C#
1
2
3
4
if (client == null) 
{ 
    client.Close(); 
}
Никого этот кусок не беспокоит?
1
22 / 21 / 8
Регистрация: 17.02.2011
Сообщений: 399
29.07.2019, 11:34  [ТС]
Беспокоит, я его уже исправил не в нём дело

Добавлено через 3 минуты
Не фигня какая-то, я не могу получить с connect потому как оно ни чего не возвращает, connected я проверить не могу, но и послать ни чего не могу потому как поток не создан, получается что надо проверить Networkstream на null, попытаться write, а потом проверить connected?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.07.2019, 11:34
Помогаю со студенческими работами здесь

Во время обновления фрейма вызывает exception java.lang.AbstractMethodError
Есть стандартная JTable, которая почему-то во время обновления фрейма вызывает exception java.lang.AbstractMethodError:...

Значение Null в datagridview вызывает исключение. Не получается использовать Try-Catch
Доброго времени суток. Чет уже котелок совсем не варит. после прохождения всех строк в DGV ...

Null Pointer Exception
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package user; import...

Null reference exception :)
Здравствуйте, уважаемые форумчане Такая проблема: При закрытии окошка записываю строки DatagridView в List<String>. Перебираю...

@Autowired null pointer exception
При авторизации пользователя, в классе CustomUserDetailsService UserService не инициализируется, бросает NullPointerException В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru