IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Exception levée*: 'System.NullReferenceException' lors de l'appel à une méthode clear()


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Exception levée*: 'System.NullReferenceException' lors de l'appel à une méthode clear()
    Bonjour,

    Je rencontre un comportement étrange sur l'appel de la méthode Clear() sur un Tabcontrol.

    Lors du démarrage de mon programme, dans le form_load, je reconstruit un TabControl en fct du niveau d'accès de l'utilisateur.
    Pour cela :

    1. Je mémorise dans une liste les TabPages présentes par défaut (celles que j'ai crée avec le concepteur)
    2. J'efface mon Tabcontrol
    3. Puis je rajoute dans mon TabControl, les TabPages en fonction des droits d'accès de l'utilisateur

    Cette séquence se déroule jusqu'au bout et j'obtiens au final ce que je souhaite.

    Mais lorsque j'effectue l'étape 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTab.TabPages.Clear()

    j'ai systématiquement un message d'exception qui apparait dans la fenêtre Sortie.
    Exception levée : 'System.NullReferenceException'

    Pourquoi ?

    Avant l'appel à la méthode Clear() mon TabControl n'est pas vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Debug.WriteLine(MonTab.TabCount.ToString & " TabPages")
    Try
      MonTab.TabPages.Clear()
    Catch ex As Exception
      Debug.WriteLine("Message :" & ex.Message)
    End Try
    ' J'obtient ceci : 
    ' 2 TabPages
    ' Exception levée : 'System.NullReferenceException'
    J'ai mis un point d'arrêt dans le catch et apparemment, je n'y passe pas.
    Pourtant, dans ma fenêtre Sortie, j'ai bien un message d'exception qui apparait...

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    J'essaie de produire cette erreur sur mon ordi et je n'y parviens pas ...

    Ne peux-tu nous donner davantage de codes, comment sauves-tu tes TabPages, comment les réinsers-tu, sous quelle procédure événementielle tentes-tu de vider la collection des TabPages, ..., bref des éléments pour produire l'erreur (je me marre, d'habitude je ne demande pas comment produire des erreurs, ça me vient tout seul, c'est un don ...)

    Cdt

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Inutile de citer le message précédant, cela alourdit la lecture.
    Aie !
    J'ai essayé de faire un petit bout de code simple en exemple pour mettre en évidence le pb et…
    Je n'arrive pas à reproduire l'exception…

    cela veut dire que je suis passé à côté de quelque chose…


    En fait, mon problème apparait dès le form_load :

    Dans celui-ci, j'initialise les droits de l'utilisateur au plus bas niveau. Donc je vais virer par exemple, les TabPages "critiques" que j'ai défini à l'aide du concepteur.
    Voilà mon exemple… qui malheureusement fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Public Class Form1
        Private MonTab As New TabControl
        Private BtnClr As New Button
        Private MemoTabPage As New Generic.List(Of TabPage)
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            MonTab.Dock = DockStyle.Fill
            For i = 1 To 4
                MonTab.TabPages.Add("Essai " & i.ToString)
            Next i
            Me.Controls.Add(MonTab)
            CreateCtrl()
            BtnClr.Dock = DockStyle.Left
            BtnClr.Text = "Clear"
            Me.Controls.Add(BtnClr)
     
            For Each p As TabPage In MonTab.TabPages
                MemoTabPage.Add(p)
            Next
            AddHandler BtnClr.Click, AddressOf Btn_Click
            RafrMonTab()
        End Sub
     
        Private Sub CreateCtrl()
            For Each page As TabPage In MonTab.TabPages
                Dim btn As Button
                Dim txt As TextBox
                Dim h As Integer
                For i = 1 To 10
                    btn = New Button
                    btn.Text = "Bouton " + (i + (page.TabIndex * 10)).ToString
                    h = 15 + (btn.Height * i)
                    btn.Location = New Point(15, h)
                    txt = New TextBox
                    txt.Location = New Point(30 + btn.Width, h)
                    page.Controls.AddRange(New Control() {btn, txt})
                Next
            Next
     
        End Sub
     
        Private Sub RafrMonTab()
            MonTab.TabPages.Clear()  ' <==== C'est ICI que j'obtiens mon exception
            ' Pour l'exemple je recopie tout mais en réalité il y a un filtrage suivant les droits d'accès.
            For Each p As TabPage In MemoTabPage
                MonTab.TabPages.Add(p)
            Next
        End Sub
     
        Private Sub Btn_Click(sender As Object, e As EventArgs)
            RafrMonTab()
        End Sub
     
    End Class

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bien ... donc plus de problème ...

    A toutes fins utiles, voici le code que j'utiliserais pour éviter le Clear :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
            For Each P As TabPage In MonTab.TabPages
                MemoTabPage.Add(P)
                MonTab.TabPages.Remove(P)
            Next
    Mais je placerais ce code dans ta Sub RafrMonTab() plutôt que sur le Load du Form.

    Cdt ...

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    Bien ... donc plus de problème …
    Ben si , le pb est toujours présent dans mon code initial. Je vais continuer à chercher la différence entre mon exemple et l'original : il y a forcement une raison.


    Citation Envoyé par Phil Rob Voir le message
    [...]Mais je placerais ce code dans ta Sub RafrMonTab() plutôt que sur le Load du Form.
    Je n'ai pas trop le choix : Mon IHM à la base est écrite via le designer : donc j'ai tous les onglets de présents et je suis obligé de faire au moins un appel à cette méthode dans le form_load.
    Le clear est déjà dans la sub RafrMonTab. Cette sub est appelée au démarrage ainsi qu'à plusieurs autres endroits dans le prog (saisie de mot passe, actions qui verrouillent certains onglets, etc...)

    Pour la mémo, il me faut conserver la totalité des pages si je souhaite y accéder plus tard. Je ne peux pas faire ce que tu dis...

  6. #6
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    OK ...
    Mais peux-tu au moins essayer de remplacer les Clear par mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    'Dans le Load, là où tu sauves les TabPages :
     
            For Each P As TabPage In MonTab.TabPages
                MemoTabPage.Add(P)
                MonTab.TabPages.Remove(P)
            Next
     
    ' et ailleurs où tu ne dois plus sauver les TabPages :
     
            For Each P As TabPage In MonTab.TabPages
                MonTab.TabPages.Remove(P)
            Next
    Bon travail ...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Phil Rob Voir le message
    OK ...
    Mais peux-tu au moins essayer de remplacer les Clear par mon code :
    Bon travail ...
    J'ai essayé ta solution, cela ne change pas mon pb.
    En fait j'ai l'impression que ces manips me font déclencher des events qui sont interceptés pour du traitement spécifique aux TabPages.
    J'ai notamment des méthodes sur des TabPage_enter et TabPage_leave…
    Or lorsque cela arrive dans le form_load, certaines variables / objets ne sont pas encore correctement initialisées / instanciés.
    Je planche dessus…

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    lorsque cela arrive dans le form_load, certaines variables / objets ne sont pas encore correctement initialisées / instanciés.
    C'est pour cela que j'évite de programmer (autant que possible) sous l'événement Load ..., le préfère l'Activate. Toutefois, la logique du programme interdit que des opérations soient répétées lors des ré-activation. Il est possible de placer une variable dans la procédure Activate de sorte à ne faire certaines actions que lors de la première activation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Pivate Sub Form_Activate( .... ) ...
    Static PremiereActivation As Boolean = True
    If PremiereActivation Then
    PremiereActivation = False
    ' ... ici tout ce code qu'on souhaite n'exécuter qu'une seule fois, au lancement du programme
    End If
    ' Autres codes éventuellement déjà prévus pour l'Activate ...
    End Sub
    Si ton problème vient effectivement du fait du Load "inachevé", Activate devrait te servir.

    J'espère que ceci t'aidera.

    Bonne nuit

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,
    Je reouvre ce sujet car je pensais avoir résolu mon pb mais il n'en est rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Try
      While Onglet.TabPages.Count <> 0
        Onglet.TabPages.RemoveAt(0)
      End While
     
    Catch ex As Exception
      Debug.WriteLine("Message :" & ex.Message)
    End Try
    Avant de rentrer dans mon while, je vérifie que j'ai des TabPages -> J'en ai 2
    Lorsque je deroule le code en pas à pas, le removeAt me provoque un 'System.ArgumentOutOfRangeException' dans System.Windows.Forms.dll dès le 1er appel dans la fenêtre Sortie
    Pourtant le code se poursuit comme si rien ne s'était passé (je ne suis pas dérouté dans le catch), le RemoveAt s'est réellement exécuté jusqu'au bout.
    J'obtiens le même phénomène en passant par la méthode Clear

    Etrange, non ?
    Images attachées Images attachées  

  10. #10
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Points : 672
    Points
    672
    Par défaut
    Salut,
    Essaie çà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each MyTabPage as TabPage in Onglet.TabPages
         Onglet.TabPages.Remove(MyTabPage)
    Next
    @+

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Bonjour,

    Merci r.morel, Je viens d'essayer et cela m'a permit de comprendre ce qu'il se passe.

    J'obtiens une autre exception, celle que j'avais au tout début de ce post (System.NullReferenceException)
    Ce qui m'a fait dire, qu'un autre bout de code plante ailleurs dans le programme sans que je puisse savoir lequel…
    Donc un évènement… (c'est d'ailleurs pénible, existe t-il un moyen de tracer la cause ?)

    J'avais oublié de désactiver un gestionnaire d'évènement sur mon tabControl.

    En supprimant le handler avant de vider le tabControl, je n'obtiens plus d'erreur.
    Cela m'a permit de réutiliser la méthode Clear sans pb et de virer le try/catch qui ne servait plus à rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub RafrOnglet(ByVal level As eUserMode)
      RemoveHandler Onglet.SelectedIndexChanged, AddressOf Onglet_SelectedIndexChanged
      Onglet.TabPages.Clear()
      '
      ' la suite de mon code….
      '
      '
      AddHandler Onglet.SelectedIndexChanged, AddressOf Onglet_SelectedIndexChanged
    End Sub

  12. #12
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Il me reste encore un autre problème dans mon programme mais j'ai bien peur qu'il n'existe pas de solutions.


    J'ai des exceptions 'System.IO.FileNotFoundException' dans mscorlib.dll à chaque fois que j'instancie un XmlSerializer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     serialXML = New Xml.Serialization.XmlSerializer(GetType(AppConfiguration))
    Même en jouant sur les options avancées de compilation (il y a un combo à ce sujet) cela ne résous pas le pb.

    Ce n'est pas bloquant, le programme fonctionne quand même, mais cela me pique aux yeux à chaque fois que je vois passer ces exceptions dans la fenêtre de sortie.

  13. #13
    Membre éclairé Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Points : 672
    Points
    672
    Par défaut
    Je fais de sérialization comme expliqué ici.
    Je n'ai jamais rencontré ce type de problème. L'erreur "FileNotFoundException" apparait lorsque le fichier est introuvable. Tu peux tenter de vérifier si ton fichier existe. Où stock tu on fichier xml ?

  14. #14
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2010
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    En fait c'est avant de lire le xml que j'ai cette exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Private Function LoadConfiguration() As Boolean
     
        Dim serialXML As Xml.Serialization.XmlSerializer
        Dim Reader As StreamReader
        Try
            serialXML = New Xml.Serialization.XmlSerializer(GetType(AppConfiguration))   ' <---- C'est ici que l'exception est levée (pour info, je ne bascule pas dans le catch)
     
            Reader = New StreamReader(Path.Combine(appData, "Config.xml"))
            Config = CType(serialXML.Deserialize(Reader), AppConfiguration)
            Reader.Close()
     
        Catch ex As Exception
            LogTrace.WriteLine("#" + GetCurrentMethod().Name + " : " + ex.Message)
            Return False
        End Try
        Reader = Nothing
        serialXML = Nothing
        TxbCfgPosXChargement.Text = Config.PlateauChargement.ToString
        TxbCfgPosXEchantillon.Text = Config.PlateauEchantillon.ToString
        TxbCfgPosXTampon.Text = Config.PlateauTampon.ToString
        TxbCfgPosXLame.Text = Config.PlateauLame.ToString
        ' . . . . 
    End Sub
    Et ma classe de configuration est écrite ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Serializable>
    Public Class AppConfiguration
        ''' <summary>Coordonnée en X du plateau en position de chargement. L'unité est en mm.</summary>
        Public PlateauChargement As Double
        ''' <summary>Coordonnée en X du plateau pour prendre l'échantillon. L'unité est en mm.</summary>
        Public PlateauEchantillon As Double
        ''' <summary>Coordonnée en Z du plateau pour faire tremper le tampon dans l'échantillon. L'unité est en mm.</summary>
        Public AltitudeEchantillon As Double
        ''' <summary>Coordonnée en X du plateau pour prendre le tampon. L'unité est en mm.</summary>
        Public PlateauTampon As Double
        ' . . . . 
    End Class
    Le GetType(AppConfiguration) renvoi bien les bonnes infos.
    Nom : 2019-05-24 11_22_49-Consolab (Débogage) - Microsoft Visual Studio.png
Affichages : 428
Taille : 38,2 Ko

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2017, 23h01
  2. Probleme lors de l'appel à une méthode
    Par doditch77 dans le forum C++
    Réponses: 10
    Dernier message: 07/01/2008, 00h58
  3. Réponses: 12
    Dernier message: 23/05/2007, 21h40
  4. Réponses: 3
    Dernier message: 01/05/2007, 16h07
  5. Appeler une méthode lors d'un ENTER avec javascript
    Par shirya dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 22/01/2007, 21h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo