NullReferenceException J'ai besoin d'aide ! Rien ne fonctionnne ! :( [Résolu]

Messages postés
15
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
17 juin 2013
- - Dernière réponse :  Jose - 26 juin 2014 à 11:24
Bonjour, hier j'ai pensé à une façon de stocker des tables dans un fichier texte, et j'ai voulu l'essayer. En gros, le code qui suit ne sert qu'à ouvrir le fichier et stocker la table dans un array à 2 dimensions table()(). Mon problème, c'est qu'en l'exécutant, j'obtiens l'erreur suivante : "A System.NullReferenceException has thrown.:"Object reference not set to an instance of an object." à la ligne 24.

J'ai beau tout essayer, rien ne fonctionne !

Merci d'avance pour votre aide, Phyyl

Voici le code :
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Dim sw As StreamWriter = New StreamWriter("c:/Test1.test")
        'sw.WriteLine("")
        'sw.Close()
        Dim sr As StreamReader = New StreamReader("c:/test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
        Dim table()() As String

        For i = 0 To split.Length
            Dim id As String
            Dim name As String
            Dim phone As String
            Dim a() As String = split(i).Split("/").ToArray

            id = a(0)
            name = a(1)
            phone = a(2)

            table(i)(0) = a(0)
            table(i)(1) = a(1)
            table(i)(2) = a(2)

        Next

    End Sub
End Class
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
87
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
28 mai 2013
1
3
Merci
Salut,

Ton tableau (table) n'est pas initialisé. C'est à dire qu'il faut lui donner la taille qu'il doit avoir dans ta boucle...

ton code sera plus

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sr As StreamReader =  New StreamReader("c:\test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
         Dim table(split.Length - 1)() As String    ' tu initialises ton tableau avec le nombre de ligne

        For i  = 0 To split.Length - 1 'ici split.Length - 1 sinon tu vas trop loin dans ton tableau split
            Dim id As String
            Dim name As String
            Dim phone As String
            Dim a() As String =  split(i).Split("/").ToArray

            id = a(0)
            name = a(1)
            phone = a(2)
             ReDim table(i)(2)  'ici tu règles le nombre d’éléments par ligne
            table(i)(0)  = a(0)
            table(i)(1) = a(1)
            table(i)(2) = a(2)

        Next

    End Sub



Attention tu dois faire certains contrôles

-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 145 internautes nous ont dit merci ce mois-ci

Commenter la réponse de biolo24fr
Messages postés
14457
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 mai 2019
130
0
Merci
Bonjour,

Dans ton cas, plutot aller du coté des collections :
List(Of String())

ça sera plus souple et plus rapide.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS et aussi ce lien[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : )
[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés./list
---
Mon site
Commenter la réponse de NHenry
Messages postés
15
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
17 juin 2013
0
Merci
Wow merci biolo ! ca explique bien des choses... je ne savais pas qu'il fallait initialiser la "top layer" d'un array ! et je ne savais pas comment utiliser ReDim ! Merci ! :)
Commenter la réponse de phyyl
Messages postés
15
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
17 juin 2013
0
Merci
Et NHenry tu pourrais développer un peu ? parce que je suis pas très famillier avec les collections ... Merci !
Commenter la réponse de phyyl
Messages postés
87
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
28 mai 2013
1
0
Merci
Salut,

Juste pour info tu peux mettre plutôt un redim preserv qui est plus juste. Comme l'a dit NHenry il vaut mieux utiliser les List(Of ). Par exemple tu peux créer une classe qui va te créer un objet "personne" avec les arguments id,name,phone et tu feras ainsi un List(of personne)

Classe personne :

Public Class Personne

    Private mid As String
    Private mName As String
    Private mphone As String

    Public Property id() As String
        Get
            Return mid
        End Get
        Set(ByVal value As String)
            mid = value
        End Set
    End Property


    Public Property Name() As String
        Get
            Return mName
        End Get
        Set(ByVal value As String)
            mName = value
        End Set
    End Property

    Public Property phone() As String
        Get
            Return mphone
        End Get
        Set(ByVal value As String)
            mphone = value
        End Set
    End Property

    Public Sub AddPersonne(ByVal id As String, ByVal name As String, ByVal phone As String)
        mid = id
        mName = name
        mphone = phone
    End Sub
  
End Class



Ensuite dans ton dev tu feras :

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sr As StreamReader = New StreamReader("c:\test1.test")
        Dim all As String = sr.ReadToEnd
        Dim split() As String = all.Split(";").ToArray
        Dim table As List(Of Personne) = New List(Of Personne)

        For i = 0 To split.Length - 1 'à chaque boucle tu crées une personne et tu l'ajoutes à ta liste         
            Dim a() As String = split(i).Split("/").ToArray
            Dim personne As New Personne
            personne.AddPersonne( a(0), a(1),a(2))
        Next
    End Sub


tu peux manipuler facilement la liste en la parcourant comme un tableau...

En espérant que ça t'aide... Comme je t'ai dit il faut faire certains contrôles (contrôle du chemin du fichier, que ton split soit pas vide etc....)

-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Commenter la réponse de biolo24fr
Messages postés
87
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
28 mai 2013
1
0
Merci
Juste pour info, pour l'initialisation de "table" tu peux mettre aussi :
 Dim table As List(Of Personne) = New List(Of Personne)

est équivalent à


 Dim table As new List(Of Personne) 



-----------------------------------------------------------------------------------------------------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Commenter la réponse de biolo24fr
Messages postés
14457
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
26 mai 2019
130
0
Merci
Bonjour,

Merci biolo24fr pour ton explication complétant bien mon embryon d'idée.

Juste pour précision (détail) :
Ces 2 lignes sont similaire, mais pas identiques :
Dim table As List(Of Personne) = New List(Of Personne)
Dim table As new List(Of Personne)


Car si on fait dans le code :
table = Nothing


La première ligne conservera le Nothing alors que la 2ième recréera une instance de la classe.

De fait, la première ligne est plus optimisée que la 2ième.

Juste pour la précision.

Mon site
Commenter la réponse de NHenry
Messages postés
15
Date d'inscription
mercredi 8 juin 2011
Statut
Membre
Dernière intervention
17 juin 2013
0
Merci
Merci tout le monde, j'ai finalement réussi a faire fonctionner mon truc, en gros, j'utilisais id,name,phone simplement comme exemple... en faite, je suis en train de créer un programme de gestion de prix et d'inventaire. Grace a votre aide, ca a débloquer, et j'ai donc créer mon propre type de base de données(beaucoup plus complexe que ca) et voici le résultat. :

Avec une base de données access, mon fichier de 300 items (ainsi que leur détails) faisait environ 81.5Mo
avec mon format, j'obtient une base de donnée 100000x plus simple a utiliser, 100000x plus rapide, et plus légere... 61Ko !!!

Encore une fois merci !

Phyyl
Pouvez vous me donner des informations concernant votre démarche ?

Merci
Commenter la réponse de phyyl