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 :

Message d'erreur : La référence d'objet n'est pas définie


Sujet :

VB.NET

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut Message d'erreur : La référence d'objet n'est pas définie
    Bonjour,

    J'ai un fichier que je lit et je ne veut ré-enregistrer qu'a partir de la 5éme ligne. J'utilise donc un compteur pour sa voir ou je me trouve dans mon fichier.

    Arrivé a ce point, je SPLIT les lignes aux "*" et je choisis les morceaux que je veut.

    Mais il m'affiche un message d'erreur que je trouve complétement hors sujet, et je n'arrive donc pas a trouver le problème...

    Voici 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
    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
     
     
            Dim i As Integer = 0
            Dim Chemin As String
            Dim result As String()
            Dim Fichier As String = ""
     
            Chemin = "c:\test2\" & Me.CB_CODE.SelectedItem & ".txt"
     
            Try
     
                Dim monStreamReader As New StreamReader(Chemin)
                Dim ligne As String
                ligne = monStreamReader.ReadLine()
     
                Do
     
                    ligne = monStreamReader.ReadLine()
     
                    If i > 4 Then
     
                        While ligne <> ""
     
                            ligne = monStreamReader.ReadLine()
                            result = ligne.Split("*")
                            Fichier = Fichier & result(0) & ";" & result(8) & ";" & vbCrLf
     
                        End While
     
                    End If
     
                    i = i + 1
     
                Loop Until ligne Is Nothing
     
                monStreamReader.Close()
     
            Catch ex As Exception
                MsgBox(ex.Message.ToString())
            End Try
    Message d'erreur :
    La référence d'objet n'est pas définie à une instance d'un objet.

    D'après des MsgBox de contrôle, j'ai pu m'apercevoir que la variable Fichier se remplissais correctement...


    Merci d'avance,
    Cordialement.

  2. #2
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Bonjour,

    La référence d'objet n'est pas définie à une instance d'un objet.
    Cette erreur signifie qu'un de tes objets est à null et que tu tentes d'utiliser une méthode sur celui-ci.
    Peux-tu nous fournir la StackTrace de l'erreur (numero de ligne) ?
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    L'erreur se produit après avoir lu toute les lignes non-vides ( <> "" )

    Il lit toute les ligne puis affiche l'erreur.

    Et lorsque que je supprime ce qu'il y a à l'intérieur du While, plus de message d'erreur.

  4. #4
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Peux tu envoyer la StackTrace quand même
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    comment je fait pour la récupérer?

  6. #6
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Voila comment on récupère "une trace de pile" d'une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Catch ex As Exception
                MsgBox(ex.Message.ToString())
                MsgBox(ex.StackTrace.ToString())
            End Try
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Voilà ce qu'il y a marqué dans la msgbox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "à Nom_appli.Form3.BT_EXPORTER_click(object sender, eventargs e) dans C:\...\Form3.vb: ligne 256"
    Et la ligne 256 correspond à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = ligne.Split("*")
    du while.

  8. #8
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Voilà ce qui pose problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
         ligne = monStreamReader.ReadLine()
     
                Do
     
                    ligne = monStreamReader.ReadLine()
     
                    If i > 4 Then
     
                        While ligne <> ""
     
                            ligne = monStreamReader.ReadLine()
           ...
    Si, à la limite on excepte le premier, (mais si le fichier était totalement vide, cette ligne planterait automatiquement) à chaque tour de boucle Do, tu lis les lignes 2 par 2, et surtout sans tester à aucun moment si tu es arrivé à la gin du fichier.
    Donc lorsque c'est le cas, ligne vaut Nothing, et donc ton Split plante.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  9. #9
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Voila ce qui se passe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       ligne = monStreamReader.ReadLine()
       result = ligne.Split("*")
    ta méthode ReadLine te retourne une valeur vide (nothing) dans ligne car il n'a plus rien à lire sans doute. donc lorsque tu veux faire un Split de ta variable ligne, il est pas content, car Split de rien c'est mal

    pour contrer ce problème il faut juste tester la valeur de ligne avant de Splitter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    If ligne IsNot Nothing Then 
     ' la tu fais ton split et le reste
       ligne = monStreamReader.ReadLine()
       result = ligne.Split("*")
    End If
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  10. #10
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Je vois que Sehnsucht a été plus rapide que moi.
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Merci pour ton aide

    J'ai trouvé moi même après le message de la StackTrace!

    Et c'est maintenant logique

    Je ne connaissait pas du tout cette StackTrace, mais ça va m'être très utile maintenant.


    Merci encore.

    édit: merci aussi à Sehnsucht, je n'avait pas vu son message ^^

  12. #12
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    @majo59
    De rien, mais il reste encore beaucoup de choses potentiellement "plantables" dans ton code ou tout du moins, pas bien joli-joli.

    Si jamais tu as une erreur tu passe dans ton Catch, mais tu ferme donc jamais ton StreamReader.
    Ta concaténation avec resultat(8) ... que se passe-t-il s'il n'y a pas assez d'éléments dans resultat (je me doute que Toi tu sais, qu'il y en a assez, mais rien ne dis que le fichier n'a pas été modifié à la main par quelqu'un "en ton absence").
    Toujours sur cette concaténation, C'est toujours mieux de passer par un StringBuilder, pour gérer les fichier textes.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  13. #13
    Membre émérite
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Heureux de t'avoir fait progresser

    En revanche prend bien en compte les remarques de Sehnsucht.
    Tu cours potentiellement un rique avec la ligne suivante si ton fichier est vide par exemple :

    il faudrait que tu fasse un test pour vérifier que ligne est différent de nothing avant de commencer ta boucle.

    Bon courage !
    .
    Pas de question technique en MP, merci.
    .
    Un emulator Gameboy Color pour Windows Phone ?
    c'est moi qui l'ai fait

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Merci pour vos conseils.

    je connait bien toute les erreurs potentielle qui traine... surtout a cause de la lecture...

    Je ne suis pas expert en VB.NEt et j'essaye de sécurisé le maximum. Mais je voit bien qu'il me reste pas mal de progrès a faire

    C'est vrai que mon programme marche a la perfection seulement si personne ne vient s'amuser à changer les fichier.


    Merci encore pour vos conseils

  15. #15
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Je te conseille d'essayer quelque chose comme ceci (peut-être pas parfait à 100% j'ai fait vite )
    Code VB.Net : 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
     
    Dim chemin As String = String.Format("C:\test2\{0}.txt", Me.CB_CODE.SelectedItem)
     
    If Not IO.File.Exists(chemin) Then
        MessageBox.Show(String.Format("Fichier `{0}` introuvable.", chemin))
        Exit Sub
    End If
     
    Dim ligne As String
    Dim elements() As String
    Dim compteur As Integer = 0
    Dim sB As New StringBuilder()
     
    Using sR As New StreamReader(chemin)
        Try
            Do Until sR.EndOfStream
                If compteur <= 4 Then
                    compteur += 1
                    Continue Do
                End If
                ligne = sR.ReadLine()
                elements = ligne.Split("*"c)
                If elements.Length >= 9 Then
                    sB.AppendFormat("{0}{1}", elements(0), elements(8))
                    sB.AppendLine()
                Else
                    'TODO: Gérer le cas où il n'y a pas assez d'éléments
                End If
            Loop
            'TODO: Remplacer ici, le Catch général sur une Exception quelconque par des Catch spécifiques aux types d'érreurs susceptibles d'être rencontrés, et laisser à la rigueur le Catch général en dernier.
        Catch ex As Exception
            'TODO: Ne garder la MessageBox (et surtout bannir MsgBox qui n'est là que pour la compatibilité VB6) que pour le débug et la remplacer par une écriture dans un fichier log par exemple.
            MessageBox.Show(ex.Message)
        Finally
            If sR IsNot Nothing Then sR.Close()
        End Try
    End Using
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2010
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Oui mais le truc du File.Exist, c'est inutile, car le fichier est sélectionné à partir d'une ComboBox répertoriant les fichier existants. Donc si il à était sélectionné, c'est qu'il existe

  17. #17
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    J'imagine que cette ComboBox est chargée au lancement du formulaire ?

    Donc tu lances le programme, il charge la ComboBox, ensuite moi petit malin ^^, je supprime le fichier, et je sélectionne l'entrée toujours présente dans la ComboBox, et bam, ça plante !
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/11/2011, 18h26
  2. Réponses: 5
    Dernier message: 25/10/2011, 10h31
  3. Réponses: 7
    Dernier message: 31/12/2009, 09h10
  4. Réponses: 20
    Dernier message: 13/08/2007, 16h11
  5. Réponses: 8
    Dernier message: 04/06/2007, 16h20

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