2017-07-27 2 views
0

J'ai fait une application qui communique via une deuxième TCP d'application et je reçois une erreur:référence d'objet non définie C#

System.NullReferenceException: 'Object reference not set to an instance of an object.' --> s was null at the while loop.

Cette erreur ne se produit que lorsque je ferme avec force la seconde application (en appuyant sur X en haut de l'application ou le tuer via le gestionnaire de tâches) qui est toujours connecté avec le premier.

Ma première application qui reçoit les commandes et les imprime:

try 
{ 
    StreamReader reader = new StreamReader(client.GetStream()); 
    StreamWriter writer = new StreamWriter(client.GetStream()); 
    string s = String.Empty; 
    while (!(s = reader.ReadLine()).Equals("PING")) 
     Console.WriteLine(s); 
    reader.Close(); 
    writer.Close(); 
    client.Close(); 
} 
catch (IOException) 
{ 
    Console.WriteLine("woops an error!"); 
} 

Ma deuxième application qui envoie les commandes:

try 
{ 
    TcpClient client = new TcpClient("192.168.0.107", 8080); 
    StreamReader reader = new StreamReader(client.GetStream()); 
    StreamWriter writer = new StreamWriter(client.GetStream()); 
    writer.WriteLine("PING"); 
    writer.Flush(); 
    reader.Close(); 
    writer.Close(); 
    client.Close(); 
}catch(Exception ex) 
    Console.WriteLine(ex.Message); 

J'ai essayé de vérifier si de la == null (comme ci-dessous) et il jette encore une exception.

while (!(s = reader.ReadLine()).Equals("PING") || (s==null)) 
+1

double possible de [Qu'est-ce qu'un NullReferenceException, et comment puis-je résoudre ce problème?] (https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and- how-do-i-fix-it) – Filburt

+0

votre lecteur de flux dépend de votre objet client, qui est éliminé lorsque la seconde application se déconnecte, ajoutez simplement un traitement d'erreur. – ConnorLSW

+0

Votre deuxième vérification 's == null' exécuté après que vous appelez la méthode' Equals' –

Répondre

3

Si reader.ReadLine() retourne null, null sera affectée à s puis vous immédiatement appelez Equals sur le nul (toute cession retourne automatiquement la valeur qui a été attribué) .. les s = = null ne fait rien pour empêcher cela et en effet il ne peut pas; l'échanger vers la gauche n'aiderait pas non plus parce que les parenthèses ont la priorité - vous devez le vérifier avant que vous n'appeliez .Equals dessus

Vous feriez mieux d'utiliser une boucle for et ne pas essayer de le faire beaucoup dans une déclaration

for(s = reader.ReadLine(); s!=null && s.Equals("PING"); s = reader.ReadLine()) 
+0

+1 pour ne pas essayer de faire autant en une seule instruction. Je pense que OP a fini par créer de la confusion pour lui-même. – KSib

+0

Je ne suis pas non plus un grand fan de faire des milliards de choses en une seule ligne. C'est déroutant pour vous et pour les autres qui pourraient avoir besoin de maintenir votre code. – JuanR