none
StackOverflow/NullReference Exception avec les class en C# RRS feed

  • Question

  • Bonjour à vous !

     

    Je suis en train de developer un client IRC en C#, pour que mon code sois plus propre et plus simple pour moi, j'ai crée plusieurs classes que je declare dans ma Form principale (Form1 par exemple)

    Mais le probleme, c'est que certaines classes utilisent une fonction de la form principale.

    Donc je fais :

     

    Form1 myform;

     

    Puis j'appelle ma fonction...

     

    myform.Send("Mon message");

     

    Mais lors du debug, une erreur de NullReferenceException apparait.

     

    Je change donc Form1 myform; par Form1 myform = new Form1();

     

    Mais cette fois une exception de type StackOverflow apparait.

     

     

    Pouvez vous m'aider ? Merci beaucoup.

    dimanche 29 août 2010 20:16

Réponses

  • Bonjour,

    au lancement de l'application la classe MainClass crée une instance de la classe IRCAction qui elle même instancie MainClass ...ect.. d'ou l'exception de type StackOverflow.

    Pour éviter cela utiliser supprimer la variable globale et passer la form en paramètre, ou mieux ne pas référencer votre form depuis le code de la classe IRCAction pour ne pas avoir de lien entre votre IHM et votre couche technique.

    Cordialement

    lundi 30 août 2010 14:57
    Modérateur

Toutes les réponses

  • Bonjour,

    StackOverflowException indique le plus souvent qu'une méthode s'appelle elle-même de manière infinie. Pouvez-vous nous montrer le code du constructeur de Form1 et le code contenant myForm.Send("Mon message") ?

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    dimanche 29 août 2010 20:37
    Modérateur
  • //Form1.cs
    
    public void SendMessage(string message)
    {
    try
    {
    SendMSG("PRIVMSG " + channel + " " + message + "\r\n");
    }
    catch { }
    }

    private void SendMSG(string msg)
    {
    try
    {
    string request = msg;
    byte[] requestBuffer = Encoding.ASCII.GetBytes(request);
    netstream.Write(requestBuffer, 0, requestBuffer.Length);
    }
    catch { }
    }

    Et dans le fichier : irccmd.cs

     

     

    Form1 global = new
    
     Form1();
    
    public
    
     void
    
     SendVersion()
    
    {
    
       global.SendMessage("IRC Cop 1.0\r\n"
    
    );
    
    }
    

     

     

    dimanche 29 août 2010 21:05
  • Bonjour,

    J'ai du mal à trouver d'où vient le problème... Supprimer tout d'abord les try/catch cela vous évitera des mauvaises surprises. Ensuite peut-on avoir le code du constructeur Form1 ?

    Merci de bien vouloir formater le code correctement (utilisez l'option "Insérer un bloc de code") afin que nous puissions lire convenablement votre code.

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 30 août 2010 09:44
    Modérateur
  • Que signifie le "code constructeur" ? J'ai beau faire des recherches sur google je ne trouve pas...
    lundi 30 août 2010 12:22
  • Bonjour,

    Le code du constructeur de la classe Form1, c'est la méthode qui possède la même nom que la classe. Dans votre cas elle s'appelle "Form1".

    Cordialement


    Gilles TOURREAU - MVP C# - MCTS ADO .NET 3.5 - MCPD Windows Developper 3.5 - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    lundi 30 août 2010 12:24
    Modérateur
  • namespace IRCClient
    {
      unsafe public partial class MainClass : Form
      {
    
      MainClass global;
      public MainClass(bool createNewInstance)
      {
        if(createNewInstance)
          global = new MainClass();
        else
          global = null;
      }
      IRCActions irca = new IRCActions();
      
      public MainClass()
      {
        InitializeComponent();
      }
    
      private void Form1_Load(object sender, EventArgs e)
      {
        //Connexion au serveur IRC...(Code long...)
        irca.SendVersion();
      }
      
      public void SendMessage(string message)
      {
        SendMSG("PRIVMSG " + channel + " " + message + "\r\n");
      }
      
      private void SendMSG(string message)
      {
        string request = message;
        byte[] requestBuffer = Encoding.ASCII.GetBytes(request);
        netstream.Write(requestBuffer, 0, requestBuffer.Length);
      }
    }
      
    IRCActions.cs [VERSION 1 - Erreur NullReference]
    
    namespace IRCClient
    {
      class IRCActions
      {
        MainClass global;
        public void SendVersion()
        {
          global.SendMessage("Version 1.0"); //NullReference Exception...
        }
      }
    }
    
    IRCActions.cs [VERSION 2 - Erreur StackOverflow]
    
    namespace IRCClient
    {
      class IRCActions
      {
        MainClass global = new MainClass(); //StackOverflow...
        public void SendVersion()
        {
          global.SendMessage("Version 1.0");
        }
      }
    }
    
    

    Voilà une partie de mon code, (Form1 se nomme MainClass chez moi.)
    lundi 30 août 2010 12:48
  • Bonjour,

    au lancement de l'application la classe MainClass crée une instance de la classe IRCAction qui elle même instancie MainClass ...ect.. d'ou l'exception de type StackOverflow.

    Pour éviter cela utiliser supprimer la variable globale et passer la form en paramètre, ou mieux ne pas référencer votre form depuis le code de la classe IRCAction pour ne pas avoir de lien entre votre IHM et votre couche technique.

    Cordialement

    lundi 30 août 2010 14:57
    Modérateur
  • Merci beaucoup à toi et à Gilles, vous m'avez bien éclairé. Je vais essayer de corriger mon code.

     

    Bonne journée !

    lundi 30 août 2010 15:02